服务未启动主因是环境错配、端口冲突、未守护进程、task配置缺失或低端口权限不足;需依次检查cli与fpm的php.ini一致性、端口占用、daemonize设置、ontask回调完整性及端口权限。

当你执行php start.php启动Swoole服务,终端只返回空白或报错后立即退出,进程列表里根本找不到swoole_master,说明服务压根没起来——这不是代码逻辑问题,而是启动链路上某个环节被卡死。
PHP CLI环境没加载Swoole扩展
浏览器里phpinfo()显示swoole已启用,但命令行运行php -m | grep swoole却没输出,这是最典型的“环境错配”。宝塔、多版本PHP共存、Docker镜像都容易导致CLI和FPM用的不是同一套配置。
第一步:运行php --ini,确认Loaded Configuration File路径(比如/www/server/php/80/etc/php.ini);
第二步:打开该php.ini,检查是否存在extension=swoole.so这一行;
第三步:运行ls -l /www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/swoole.so,确认so文件真实存在且权限为644;
如果php.ini里写的是extension=/absolute/path/to/swoole.so,【必须删掉绝对路径,只留extension=swoole.so】——PHP 8.0+会因路径校验失败静默跳过加载。
端口被占用或绑定失败
启动脚本没报错但ps -ef | grep php看不到进程,极大概率是端口冲突或地址绑定失败。尤其在阿里云、腾讯云上,安全组未放行、Nginx占9501、残留僵尸进程都会让监听直接失败。
方法一:查端口占用sudo lsof -i :9501 或 netstat -tulnp | grep :9501;
方法二:换端口快速验证
把代码里的new swoole_http_server("0.0.0.0", 9501)改成new swoole_http_server("0.0.0.0", 9502),排除端口冲突;
方法三:检查监听地址
别写公网IP(如"119.123.45.67"),Linux下必须用"0.0.0.0"或内网IP(用ip a查);
注意:阿里云/腾讯云的安全组必须手动放行目标端口——系统防火墙关了没用,安全组才是第一道门。
服务未后台驻留就退出
脚本执行完就消失,客户端连时提示Connection refused,是因为Swoole默认不daemonize。它不是崩了,是启动完立刻结束了。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
在代码里加$http->set(['daemonize' => 1]);;
或者启动时加-d参数:php start.php start -d;
这两者任选其一即可,【千万别同时设置,否则可能触发双重fork异常】。
task_worker配置缺失
报错failed to start server. Error: swServer_start_check: onTask is null,说明你启用了task进程但没定义onTask回调。
方法一:删掉task相关配置
移除task_worker_num、task_max_request等所有task_开头的set项;
方法二:补全onTask逻辑
在$http->on('start', ...)之前加上:$http->on('task', function ($server, $task_id, $from_id, $data) { });;
只要设置了task_worker_num,就必须注册onTask,否则服务拒绝启动。
低权限用户绑定低端口
启动时报Permission denied,且你监听的是80、443这类端口,Linux内核会直接拦截。
要么改用1024以上的端口(如9501);
要么用root用户启动:sudo php start.php start -d;
切记:生产环境严禁root跑业务进程,仅调试时临时使用。










