swoole_hook_tcp覆盖fsockopen()、stream_socket_client()等流函数及file_get_contents('http://'),但不覆盖curl_exec()或本地文件操作。

SWOOLE_HOOK_TCP 覆盖哪些函数?
它只管 PHP 流层的 TCP 相关操作,不碰系统调用或 C 扩展直连逻辑。常见被覆盖的函数包括:fsockopen()、stream_socket_client()、stream_socket_server()、stream_select()、fread()、fwrite()、fgets(),以及 file_get_contents('http://...') 这类带网络协议头的调用。
注意:file_get_contents('/tmp/a.txt') 不在此列——路径是本地文件,走的是系统 I/O,得靠 SWOOLE_HOOK_FILE。
- HTTP 请求(如 Guzzle)依赖
stream_socket_client(),必须开SWOOLE_HOOK_TCP -
curl_exec()完全不走流层,哪怕开了SWOOLE_HOOK_TCP也无效 - 某些老版本
PDO预处理模式下仍直接调read(),Hook 不进去
SWOOLE_HOOK_CURL 和 SWOOLE_HOOK_NATIVE_CURL 的区别
SWOOLE_HOOK_CURL 针对的是 libcurl 绑定的 PHP cURL 扩展,即 curl_init() + curl_exec() 这套;而 SWOOLE_HOOK_NATIVE_CURL 是 Swoole 6.0+ 引入的新标志,用于启用内置的协程版 cURL 实现(需编译时开启 --enable-swoole-curl)。
两者互斥:启用了 SWOOLE_HOOK_NATIVE_CURL 后,curl_exec() 会自动走 Swoole 自研协程客户端,性能更好、可控性更强;但若未开启该编译选项,只设 SWOOLE_HOOK_NATIVE_CURL 会静默失效。
- 生产环境推荐组合:
SWOOLE_HOOK_ALL | SWOOLE_HOOK_CURL(兼容性好) - 若确认已启用
--enable-swoole-curl,可改用SWOOLE_HOOK_ALL | SWOOLE_HOOK_NATIVE_CURL - 别混用两个 cURL flag,否则行为不可预测
Co::set() 和 Runtime::enableCoroutine() 哪个该用?
Co::set() 必须在协程上下文中调用,且只能在 Co\run() 内、所有 go() 之前执行;一旦在主进程或子协程里乱调,会直接报错 Invalid argument: Co::set() must be called in coroutine。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
Runtime::enableCoroutine() 更宽松:可在任意位置调用(包括主进程),只要在协程启动前完成即可,且它是全局生效的——后续所有协程都会继承该配置。
- 新项目统一用
Runtime::enableCoroutine(SWOOLE_HOOK_ALL),省心 - 旧代码迁移时若已有
Co::set(),检查是否误放在go()回调里,会导致部分协程没被 Hook - 多线程环境下,Swoole 6.1.3 起强制要求 Hook 只能在主线程初始化,子线程中调用会触发内存越界
为什么有些阻塞调用怎么 Hook 都不协程化?
根本原因在于:Swoole 的 Hook 是“函数级替换”,只覆盖明确注册过的 PHP 函数入口。它无法干预 C 扩展中绕过 PHP 层、直接调用 read()/write() 的逻辑,比如:
- 部分 Redis 扩展(如 phpredis)在 pipeline 模式下仍用同步 socket
- 某些 PDO 驱动在 prepare 阶段未走流层,而是直连 MySQL 协议
- 自定义扩展里硬编码的
fopen()或usleep()调用
这类情况必须换专用协程客户端(如 swoole_redis、swoole_mysql)或隔离到子进程,不能指望 Hook 解决。
最容易被忽略的一点:即使开了 SWOOLE_HOOK_ALL,sleep() 默认也不协程化,除非显式加 SWOOLE_HOOK_SLEEP,或者直接改用 co::sleep() ——后者更安全,不依赖 Hook 状态。










