# License 授权文件配置
加密器可以通过授权文件来管理加密代码的可运行环境。例如限制加密代码执行的 `IP`、`HOST`、`MAC`,以及过期时间。`License` 与加密代码分开使用。`PHP` 只需要加密一次,然后通过生成不同的授权文件给客户。
> 以下简称 **授权文件**
## 生成授权文件
若要使用授权文件功能,在加密代码时必须要指定 `product_name` ,授权文件的 `product_name` 必须与加密代码完全一致。有 `3` 种方法可以生成授权文件:
1. 官网 - 编译源代码:在加密代码时直接设置产品名称,然后设置 `IP`、`HOST`、`MAC`、过期时间和其他自定义信息,加密后下载到的压缩包中会同时包含加密代码和授权文件
2. 官网 - 生成 `License`:设置 `IP`、`HOST`、`MAC`、过期时间和其他自定义信息,获取 授权文件
3. 离线版加密器:使用 `swoole-compiler -t license config.ini` 生成授权文件
## 加载授权文件
配置 `php.ini` 设置 `swoole_loader.license_files` 加载授权文件。
```ini
[swoole_loader]
swoole_loader.license_files=/yourpath/licenseA,/yourpath/licenseB
```
> 使用 `php --ini` 或者在 `phpinfo()` 页面中查找 `php.ini` 所在的路径
> 请注意 `cli` 和 `php-fpm`、`apache` 可能使用的是不同的 `php.ini`,需要在对应的环境中去查看 `php.ini` 文件的真正路径
* 支持同时加载多个授权文件,通过英文逗号分割
* 多个授权文件的 `product_name` 不能重复
* `3.0` 或更高版本,使用 `swoole_loader.license_files=/yourpath/licenseA,/yourpath/licenseB`
* `3.0` 之前版本,使用 `swoole_license_files=/yourpath/licenseA,/yourpath/licenseB`
> 例如你的整个代码里面有 `2` 个产品 `A` 和 `B`,加密时 `product_name` 分别为 `A` 和 `B`,分别生成 `2` 个授权文件 `/yourpath/licenseA` 和 `/yourpath/licenseB`,然后配置 `php.ini` 为 `swoole_loader.license_files=/yourpath/licenseA,/yourpath/licenseB` ,`swoole_loader` 会根据产品名称找到对应的授权文件
## 获取授权信息
使用 `swoole_get_license()` 函数可以返回所加载的授权文件,格式为:
```php
array(2) {
["product_A"]=>
array(5) {
["product_name"]=>
string(4) "product_A"
["hostname"]=>
string(9) "127.0.0.1"
["expire_at"]=>
string(10) "1669976791"
["license_source"]=>
string(40) "de8a1591cb2179ff6fc2e0f6a1a95a98bba9d84c"
["user"]=>
string(15) "自定义内容"
}
["product_B"]=>
array(5) {
["product_name"]=>
string(4) "product_B"
["hostname"]=>
string(9) "127.0.0.1"
["expire_at"]=>
string(10) "1669976791"
["license_source"]=>
string(40) "de8a1591cb2179ff6fc2e0f6a1a95a98bba9d84c"
["user"]=>
string(15) "自定义内容"
}
}
```
动态加载授权文件
----
>[danger] 若无法修改 `php.ini` 来加载授权,可在程序入口文件如 `index.php` 使用 `ini_set` 实现动态加载。请注意因 `PHP-FPM` 短生命周期的特性,在非常驻内存模式下,动态加载可能会带来一些额外的性能开销
```php
ini_set("swoole_loader.license_files","/yourpath/licenseA");
```