stream_socket_server被禁用会导致workerman启动失败,因其底层依赖该函数创建监听socket;若被禁用,worker::runall()初始化时直接抛出warning并中止执行。

阻塞操作会卡死事件循环,Workerman 无法处理其他连接
为什么 stream_socket_server 被禁用会导致 Workerman 启动失败
Workerman 底层依赖 stream_socket_server 创建监听 socket。如果该函数被禁用(常见于宝塔面板默认禁用或 shared hosting 环境),Worker::runAll() 会在初始化阶段直接抛出 PHP Warning 并中止执行。
- 错误典型表现:
PHP Warning: stream_socket_server(): has been disabled for security reasons - 检查方式:运行
php -r "print_r(get_defined_functions()['disabled']);",确认stream_socket_server是否在列表中 - 修复路径:找到生效的
php.ini(用php --ini查),编辑disable_functions行,删掉stream_socket_server,然后重启 PHP 进程(如php-fpm或宝塔里的 PHP 服务) - 注意:云主机或某些安全加固环境可能不允许修改此配置,此时需换用支持异步 I/O 的替代方案(如 Swoole)或联系服务商
0.0.0.0 和 127.0.0.1 监听地址的实际区别
监听地址不是“写对就行”,它决定了网络层流量能否到达 Workerman 进程。
-
127.0.0.1:仅接受本机发起的连接(比如 curl localhost:2346),外部服务器、手机、局域网设备全部无法访问 -
0.0.0.0:绑定到所有可用网卡,允许任意来源 IP 连接(前提是端口开放、防火墙放行) - 云服务器特别注意:不要填公网 IP(如
119.29.xxx.xxx)。云厂商的公网 IP 通常由 NAT 网关映射,实际不归属本机网卡,填了会报Cannot assign requested address - 验证是否生效:启动后执行
netstat -tuln | grep :2346,看到*:2346或0.0.0.0:2346才算正确;若显示127.0.0.1:2346,则外部必然连不上
浏览器连不上 ws:// 地址的三个硬性前提
WebSocket 浏览器客户端能连上,不等于服务端写对了——中间有三道关卡必须全通。
- 服务端监听地址必须是
0.0.0.0(见上一条) - 服务器防火墙(如
ufw、firewalld或云平台安全组)必须放行对应端口(如2346),且协议为tcp - 前端 URL 必须与服务端监听协议、域名、端口严格一致:
– 若 Workerman 启动的是websocket://0.0.0.0:2346,前端必须用ws://your-domain.com:2346(HTTP 域名)或ws://ip:2346(IP 直连)
– 若用了 Nginx 反代 WebSocket,前端仍用ws://your-domain.com,但 Nginx 需透传Upgrade和Connection头,且后端proxy_pass指向http://127.0.0.1:2346
真正容易被忽略的是:Workerman 进程本身没有日志输出到控制台 ≠ 它没在跑。务必用 ps aux | grep Worker 和 netstat 双重确认进程和端口状态,别只看终端有没有报错就认为成功了。











