必须协程适配。hyperf 3.1 中直接使用同步 sdk(如原生 curl、pdo)会阻塞协程调度器,导致吞吐量断崖下跌;需优先选用 hyperf/redis、hyperf/guzzle 等协程组件,非协程 sdk 必须包裹于 coroutine::create 或替换为协程安全实现。

Hyperf3.1中集成第三方SDK必须处理协程适配
在Hyperf3.1中直接使用传统同步SDK(如原生cURL、PDO、Redis扩展)会导致协程挂起失效,整个Worker进程被阻塞,吞吐量断崖式下跌——这不是配置问题,是I/O模型不匹配的硬伤。
第一步:确认SDK是否已协程化。查看其GitHub仓库README或composer.json,若依赖swoole/ext-redis、hyperf/redis、hyperf/guzzle等官方协程组件,则可直接注入使用;若依赖ext-curl、ext-mysqlnd、monolog/monolog等纯同步库,必须走适配层。
第二步:对非协程SDK,必须包裹进Co\run()或使用Hyperf\Coroutine\Coroutine::create()显式启动新协程。例如调用百度翻译API时,不能在控制器里直接new HttpClient()→post(),而要:【用Coroutine::create包装HTTP客户端调用,否则当前协程会卡死】。
第三步:检查SDK内部是否触发了未协程化的系统调用。典型陷阱是日志写入文件(file_put_contents)、读取本地配置(parse_ini_file)、调用exec()执行shell命令——这些操作在Hyperf3.1中会阻塞整个协程调度器,必须替换为协程安全版本(如Hyperf\Logger\Logger、Hyperf\Config\Config、Hyperf\Process\Process)。
百度翻译SDK集成实操(协程化封装)
Hyperf3.1集成百度翻译不是加个SDK就行,得把它的HTTP通信、签名生成、错误重试全部跑在协程上下文里。
方法一:用hyperf/guzzle替代原生SDK
安装hyperf/guzzle并配置config/autoload/http_client.php启用协程Handler;在服务类中注入GuzzleHttp\ClientInterface,构造请求时传入['timeout' => 5.0, 'connect_timeout' => 3.0];签名逻辑用hash_hmac('sha256', $stringToSign, $secretKey)——该函数是PHP内置纯计算,无需协程适配。
方法二:手写协程HTTP客户端(适合定制化强的场景)
用Swoole\Coroutine\Http\Client直连https://fanyi-api.baidu.com/api/trans/vip/translate;注意必须手动拼接query参数并urlencode,且client->set(['timeout' => 3])后立即调用client->execute();响应体用client->getBody()获取字符串,不要用json_decode(client->getBody(), true)前不做空值判断——【若getBody()返回false,直接json_decode会报错并终止协程】。
ES8客户端集成避坑指南
Hyperf3.1默认的hyperf/elasticsearch组件无法连接ES8,强行使用会在首次调用Client::info()时抛出406 Not Acceptable错误,因为ES8根路径重定向逻辑与v7客户端不兼容。
必须改用wo_orld/hyperf-elasticsearch包,它底层对接elasticsearch/elasticsearch v8.x SDK,并复用Hyperf协程Handler。
安装后,在config/autoload/elasticsearch.php中配置host为https://elastic:your_strong_password@127.0.0.1:9200;注意密码必须是ES8重置后的强密码,空密码或简单密码会被拒绝;同时确保ES配置中已启用xpack.security.http.ssl.enabled: true和xpack.security.http.basic.enabled: true。
验证方式:在命令行执行php bin/hyperf.php di:make后,运行一个测试命令,调用$client->cat()->indices()——如果返回正常JSON结构而非406错误,说明适配成功。











