常见问题

1.报错:"load file /www/wwwroot/xxx.php failed error: Success [0]"

- 解决办法:确认xxx.php的文件权限是否正确。

2.报错:"the code encrypt by php 7.1 , but the loader version is 5.6"

- 解决办法:加密时候的版本号要和解密端(运行加密的php代码的机器)的php版本号对应上。

3.安装loader扩展后 运行一个非常简单逻辑的加了密的php代码 报"segment fault"或"Allowed memory size of xxxx"错误

- 确保你的php没有安装incube loader、xdebug、zend guard loader扩展。
- 确保swoole_loader的版本和加密器的版本对应上,例如1.9版本的加密器对应1.9版本的loader。
- 确保你的php是非`Debug`版本,使用 `php -i | grep "Debug Build"`查看是否有`Debug Build => yes`,`Swoole Compiler`不支持`Debug`版本,请安装非`Debug`版本的`PHP`

4.报错:"PHP Fatal error: Unknown: product xxxxxxx can not find in license file in Unknown on line 0 Fatal error: Unknown: product xxxxxxx can not find in license file in Unknown on line 0"

- 解决办法:添加授权信息后加密的代码包里面会包含一个license授权文件
- loader端需要在php.ini中添加以下配置:
- swoole_license_files=/yourpath/swoole-compiler.license

yourpath为存放license授权文件的路径

5.访问提示:"Loader ext not installed"

- 解决办法:
- 1.确认你的swoole-loader扩展是否安装成功
- 2.确认你的PHP版本、加密器版本以及swoole_loader的版本是否一致

loader扩展兼容性

  • 因为swoole_loader无法和xdebug和ioncube,zend guard loader扩展兼容,使用前需要先卸载.
  • 在alpine系统中swoole loader无法和opcache扩展兼容,所以在alpine系统中使用前请卸载opcache扩展

关于license文件

  • 在compiler 2.0版本以后,客户端授权改为授权文件的方式,填写授权文件信息的时候有个product_name的字段是授权文件的key,每个product_name对应一个授权文件,例如你的整个代码里面有2个产品,2套授权逻辑2个license,产品名为PA和PB,那么你需要生成2个授权文件并在php.ini中配置,用,分割,例如swoole_license_files=/yourpath/licenseA,/yourpath/licenseB,A产品的php文件会根据产品名去授权文件里面找对应的license,B产品的php文件同理。
  • swoole_get_license()函数可以返回这个php文件对应的授权文件的内容,在填写授权文件信息时候可以加自定义的k=>v对,这个函数会一并返回。

使用 Swoole Compiler 是否会降低性能

Swoole Compiler 不存在运行时解密还原 PHP源代码的逻辑,二进制目标文件只有经过处理的opcode二进制指令和内存数据,在第一次运行时将指令和数据载入内存,处理请求时没有任何性能消耗。

是否有绑定客户端机器Mac地址或域名功能

试用版本不支持此功能。正式版已经支持。

Swoole Loader 与 Opcache

Swoole Compiler 软件本身就是将PHP代码编译为经过特殊处理的opcode,所以使用Swoole Loader加载程序时,不需要其他OpCache扩展,包括opcacheapcZendGuardLoadereAccelerator等扩展。

如果你的应用程序中,同时有加密代码和非加密代码。当swoole_loader发现是非加密代码时,会将编译控制权转给opcache,由opcache实现代码的加载。

加密器与ThinkPHP

tp会将一些php文件合并到一个runtime.php里面,这样如果其中一些加密了一些没加密,那么合并后的文件就无法正常运行。有3个解决方案

  • 1修改Library/Think/Think.class.php注释掉生成runtime的地方。

  • 2修改配置开启debug模式。

  • 3整个项目不加密运行一下让框架生成runtime.php,然后加密的时候把这个runtime.php也一起加密

加密器与Composer

现代的php项目大部分都用composer做依赖管理,需要注意的是如果你的项目加密后执行composer install有可能出现问题,因为composer会分析你的项目所有的类并生成autoload_classmap.php。如果加密的代码composer是无法分析的,会导致无法加载类。 解决方案:先composer install 拉下来vender目录 再进行加密,加密的时候可以通过白名单来排除 vendor目录,或者连着vendor一起加密也可以(vendor非常大的话会比较慢)

关于文件软链接:

不要在项目中有软链接,否则在线加密会丢失文件,本地加密也会丢失软链(直接把软链接的文件当做了真实的文件).

关于注解解析方式:

symfony,swoft等框架的路由方式如果通过注释的方式是无法正确解析的,框架通过分析源码获得文件的命名空间,类名等信息,这些信息加密后都无法获得,验证方式:搜索框架源代码看有没有get_file_content,token_get_all等方法来解析php文件。

  解决方案:只能兼容下,例如symfony通过yaml配置文件的方式来路由。

  • FqFisher

    请教个问题,我的php版本是5.6.30的,引入了Zend Guard Loader模块,同时也引入swoole_loader模块后,加密后的代码无法运行,有没有好的办法解决该问题呢?

  • 郭新华

    @FqFisher 卸载掉zend的模块

  • 烈火☆寒冰

    混淆后报错了,大部分类没有问题。

    yii\base\ErrorException: Cannot declare class common\models\Test, because the name is already in use in /var/www/html/common/models/Test.php:-2147483592 Stack trace: #0 [internal function]: yii\base\ErrorHandler->handleFatalError() #1 {main}

  • 王锋

    Fatal error: Unknown: the license config file format error , use ini format and do not modify it in Unknown on line 0 报这个错误,是什么原因呢?我有按照说明在php.ini里面写上license的路径

  • ofttryaj

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 18446744072850426110 bytes) in Unknown on line 0