composer 安装 php-unleash 失败是因为该包未发布到 packagist,需手动添加 github 仓库源并使用 composer require unleash/unleash-client-php:^4.0;url 必须以 http:// 或 https:// 开头且无尾部斜杠;启用开关需匹配环境、策略及非空 context;推荐依赖注入单例并调用 destroy() 清理资源。

Composer 安装 php-unleash 失败或找不到包?
官方 php-unleash 库并未发布到 Packagist,直接运行 composer require unleash/php-sdk 会报错 “Package unleash/php-sdk not found”。它实际托管在 GitHub,需手动添加仓库源。
- 在项目根目录的
composer.json中,添加"repositories"字段(不是覆盖整个文件):
"repositories": [
{
"type": "vcs",
"url": "https://github.com/Unleash/unleash-client-php"
}
]
- 然后执行:
composer require unleash/unleash-client-php:^4.0(注意版本号,v4 是当前稳定版,v5 尚未正式发布) - 若提示签名验证失败,加
--skip-platform-checks或确认 PHP 版本 ≥ 8.1(v4 要求)
初始化 Client 时提示 “Invalid URL” 或连接超时
错误通常源于 URL 格式或网络策略。Unleash SDK 要求 URL 必须以 http:// 或 https:// 开头,且不能带尾部斜杠 —— https://unleash.example.com/ 会失败,必须写成 https://unleash.example.com。
-
Unleash\Client\Unleash::create()的url参数必须是完整地址,不含路径后缀(如/api) - 如果 Unleash 实例启用了自签名证书(常见于本地或测试环境),需传入
sslVerify => false选项,否则 cURL 报错CURLOPT_SSL_VERIFYPEER - SDK 默认使用
file缓存驱动,若sys_get_temp_dir()不可写,会静默降级为内存缓存 —— 功能正常但重启后丢失开关状态,建议显式配置cacheDir
调用 isEnabled() 始终返回 false?
不是代码写错,而是上下文(context)缺失或不匹配。Unleash 的策略(如 hostname、environment、userId)依赖 Unleash\Context 实例传入,空 context 只能匹配无策略的开关。
- 确保创建 context 时至少包含必要字段:
new Unleash\Context(['appName' => 'my-app', 'environment' => 'prod']) - 如果策略中用了
userId,必须传入字符串类型(不能是整数 ID),且长度 > 0 - 检查 Unleash 后台该开关是否已启用(toggle status = ON)、环境(environment)匹配、且策略条件满足 —— SDK 不校验权限,只做本地判断
- 首次启动时 SDK 会拉取特征开关快照,若网络不通或 token 错误,
isEnabled()默认返回false(fail-closed),不会抛异常
如何安全注入 Unleash 实例并避免全局状态污染?
直接 new Client 每次都重建连接和缓存,既低效又易出错。推荐用依赖注入容器管理单例,但要注意 SDK 内部依赖的 Unleash\Client\SpecCache 和 Unleash\Client\MetricsStore 是有状态对象。
- 不要把
Unleash\Client\Unleash实例声明为“shared: false”,否则每次 resolve 都新建 client,导致 metrics 重置、缓存失效 - 若用 Laravel,可在
AppServiceProvider::register()中绑定单例:$this->app->singleton('unleash.client', function ($app) { return Unleash::create([...]); }); - 务必在应用生命周期结束前调用
$client->destroy()(如 Laravel 的terminating事件),否则后台轮询线程可能持续运行
最常被忽略的是 metrics 上报 —— 它默认每 60 秒发一次 POST 到 /metrics,若服务端未开放该 endpoint 或反向代理拦截了非 GET 请求,会堆积 cURL 错误日志,但不影响开关判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











