apcu(尤其apcu-bc)和xdebug明确与Swoole冲突:前者因共享内存模型干扰协程调度导致segfault,后者劫持调用栈破坏协程上下文切换;生产环境必须禁用xdebug,apcu需卸载,其他如redis、mysqli等常用扩展则无冲突且推荐启用。

哪些已有扩展会和 Swoole 冲突?
绝大多数 PHP 扩展和 Swoole 共存无压力,但有两类扩展明确不兼容,必须禁用或卸载,否则 php --ri swoole 会报错、swoole_server 启动失败,甚至 PHP 进程直接崩溃。
-
apcu(尤其apcu-bc):Swoole 4.8+ 自带协程安全的内存缓存机制,apcu的共享内存模型与 Swoole 的多进程/协程调度冲突,常见现象是PHP Warning: PHP Startup: Unable to initialize module或服务启动后随机 segfault -
xdebug:仅在开发调试时启用。它会劫持所有函数调用栈,严重干扰 Swoole 协程上下文切换,导致Swoole\Coroutine::sleep()不生效、定时器错乱、go()无反应。生产环境必须关闭;开发环境如需调试,建议改用var_dump()+ 日志,或临时停用xdebug
为什么不能只靠 php -m | grep 判断冲突?
php -m 只显示模块名是否注册成功,不反映运行时兼容性。很多冲突在模块加载阶段不报错,但一调用 Swoole\Http\Server 或 Swoole\Coroutine 就崩。真正可靠的验证方式是:
- CLI 下执行:
/www/server/php/80/bin/php --ri swoole—— 输出里必须有coroutine => enabled和openssl => enabled,且无 warning - 写个最小测试脚本:
<?php echo SWOOLE_VERSION; ?>,用 CLI 运行:/www/server/php/80/bin/php test.php,能输出版本号才算通过 - 如果用宝塔,别信「软件商店」页面的绿色对勾,它只表示
.so文件被复制过去,不代表能正常初始化
其他扩展要不要动?
像 redis、mysqli、pdo_mysql、curl、json 这些常用扩展,完全不用关。Swoole 5.x/6.x 原生支持它们的协程化封装(如 Swoole\Coroutine\Redis),反而要确保它们已启用。
唯一需要留意的是 opcache:必须开启(opcache.enable=1),且推荐同时开 opcache.enable_cli=1,否则 CLI 模式下协程类 autoload 会变慢;但它和 Swoole 无冲突,无需关闭。
立即学习“PHP免费学习笔记(深入)”;
真正容易被忽略的,是那些你根本没意识到自己装了的扩展——比如某些一键包自带的 ionCube Loader 或商业加密扩展,它们常静默拦截模块初始化。遇到 php --ri swoole 空输出或报 Extension 'swoole' not present,先查 php -m 里有没有这些非常规扩展,再逐个注释掉测试。



















