workerman启动失败

本文针对Workerman启动过程中出现的不同错误进行了解析,并提供了具体的排查和解决方案,包括端口冲突、IP配置错误、函数禁用及权限问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象1

启动后报错类似如下:

php start.php start
PHP Warning:  stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (Address already in use) in /home/workerman-chat/Workerman/Worker.php on line xxxx

关键字Address already in use

失败原因:

端口被占用,无法启动。

可以通过命令netstat -anp | grep 端口号来找出哪个程序占用了端口。
然后停止对应的程序释放端口解决。

如果不能停止对应端口的程序,可以通过更换workerman的端口解决。

如果是Workerman占用的端口,又无法通过stop命令停止(一般是丢失pid文件或者主进程被开发者kill了导致),可以通过运行以下两个命令杀死Workerman进程。

killall php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9

现象2

启动后报错类似如下:

PHP Warning:  stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in /home/GatewayWorker/Workerman/Worker.php on line xxxx

关键字:Cannot assign requested address

失败原因:

启动脚本ip参数写错,不是本机ip,请填写本机ip机或者填写 0.0.0.0(表示监听本机所有ip)即可解决。

提示:Linux系统可以通过命令 ifconfig查看本机所有网卡ip。

如果您是腾讯云用户,注意您的公网ip实际是代理服务器ip,公网ip并不属于你的服务器,所以无法通过公网ip绑定,但是可以通过0.0.0.0来绑定。

现象3

Waring stream_socket_server has been disabled for security reasons in ...

失败原因:

stream_socket_server 函数被php.ini禁用

解决方法

1、运行php --ini 找到php.ini文件

2、打开php.ini找到disable_functions一项,将stream_socket_server禁用项删掉

现象4

PHP Warning:  stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)

失败原因

linux下监听端口如果小于1024,需要root权限。

解决办法

使用大于1024的端口或者使用root用户启动服务。



http://doc.workerman.net/315234

### Workerman 中配置 CORS Origin 为了使基于 Workerman 的应用能够处理来自不同源的请求,在服务器端需要正确设置 Cross-Origin Resource Sharing (CORS) 头。这可以通过修改响应头来实现,允许特定或全部域名发起跨域请求。 当遇到浏览器访问接口失败而 API 测试工具可以正常工作的情况时,通常是因为缺少必要的 CORS 配置[^2]。对于 Workerman 来说,可以在接收到 HTTP 请求之后但在发送任何实际数据前通过 `onMessage` 或者更合适的 `onRequest` 回调函数中添加相应的头部信息: ```php use Workerman\Worker; // 创建一个 http worker监听 8080 端口 $http_worker = new Worker('http://0.0.0.0:8080'); // 启动进程数 $http_worker->count = 4; // 当有客户端发来HTTP/HTTPS请求时触发此回调 $http_worker->onRequest = function($request, $response){ // 设置 Access-Control-Allow-Origin 响应头为 * 表示接受任意来源的请求, // 如果只希望某些特定站点能访问,则替换 '*' 为具体的 URL。 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if(in_array($origin, ['https://example.com', 'http://localhost'])){ header("Access-Control-Allow-Origin: {$origin}"); }else{ header("HTTP/1.1 403 Forbidden"); exit(); } // 对于预检请求(OPTIONS 方法),返回额外的响应头 if ($request->getMethod() === 'OPTIONS') { header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Authorization"); return $response->end(''); } // 正常处理其他类型的请求... }; ``` 上述代码片段展示了如何在接收到来自指定原点(`https://example.com`, `http://localhost`)的请求时才允许其进行跨站资源共享操作;同时也包含了针对预检请求(即方法为 OPTIONS 的请求)所必需的一些附加头部字段设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值