Workerman4启动报stream_socket_server()错误的四大原因:一是PHP禁用该函数,需检查php.ini中disable_functions;二是端口≤1023未获root权限,应改用≥1024端口或反代;三是监听IP非法,须用0.0.0.0或本机真实IP;四是端口被占用,需lsof或ss排查并kill进程。

Workerman4 启动时报 stream_socket_server() 相关错误,常见原因不是单一的“权限不足”,而是多种情况交织。关键要区分清楚:是系统级端口权限问题?PHP 函数被禁用?还是监听地址/端口配置不当?下面按实际高频场景逐一说明。
检查 stream_socket_server 是否被 PHP 禁用
这是最常被忽略却最易修复的一点。Workerman4 依赖该函数创建 socket 监听,若它出现在 disable_functions 列表中,服务直接无法初始化。
- 运行
php --ini找到正在使用的php.ini路径 - 打开该文件,搜索
disable_functions行 - 确认
stream_socket_server是否在其中(注意逗号分隔、前后空格);如有,直接删除该项 - 保存后重启 PHP 服务:
sudo systemctl restart php-fpm或service php-fpm restart
确认端口是否低于 1024 或未获 root 权限
Linux 下绑定 1–1023 的端口(如 80、443、8080 有时也受限)必须由 root 用户执行。普通用户启动会报 Permission denied。
- 查看你代码中监听的地址端口,例如:
new Worker('http://0.0.0.0:80') - 若端口号 ≤ 1023,改用 ≥ 1024 的端口(如 8080、9501、2346),推荐开发阶段统一用 9501–9505 区间
- 生产环境确需 80/443,应通过 Nginx 反向代理转发,Workerman 自身仍监听高权限端口
验证监听 IP 是否合法且可达
报错含 Cannot assign requested address,大概率是绑定了服务器不存在的 IP(比如填了公网 IP 但该 IP 不属于本机网卡)。
- 运行
ip a或ifconfig查看本机所有真实 IP(重点关注inet行,排除127.0.0.1和 Docker/虚拟网卡) - 启动脚本中应使用
0.0.0.0(监听全部网卡)或明确填写其中一个本地 IP(如192.168.1.100) - 云服务器(腾讯云/阿里云)切勿填控制台显示的“公网 IP”,它不归属你的操作系统,只能用
0.0.0.0
排查端口是否已被占用
报错含 Address already in use,说明目标端口正被其他进程占用——可能是残留的 Workerman 进程、Nginx、Python 服务或调试中的其他 PHP 脚本。
- 查端口占用:
sudo lsof -i :9501(把 9501 换成你的端口) - 若返回 PID,执行
kill -9 PID;若无结果但仍有冲突,尝试sudo ss -tuln | grep :9501 - 清空所有 PHP 进程(谨慎操作):
killall php或ps aux | grep 'Worker' | awk '{print $2}' | xargs kill -9


















