wokerman后台运行后,停止和查状态报错

robin2024

问题描述

1、在putty上直接前端启动,php start.php start;一切正常,使用control + C 关闭也正常。
2、在putty上启动后台运行,php start.php start -D;启动正常,执行php start.php status或者 stop ,都汇报 监听的端口已被占用的错误。
3、在前台运行的情况下,在woker的onmessage 中读取msql正常。
在后台运行的情况下,在woker的onmessage 中读取msql异常。
msql句柄在woker的onstart 中创建。

报错信息

stream_socket_server(): unable to connect to tcp://0.0.0.0:5678 (Address already in use)

操作系统及workerman/webman等框架组件具体版本

当前环境,ubuntu18、wokerman 最新版本,php8.0,mysql3.7

393 4 0
4个回答

walkor

根据描述2应该是主进程退出了,退出的原因可能是你在启动脚本里进行了一些逻辑处理产生了错误导致进程退出。
不要在启动脚本直接写业务逻辑,业务逻辑放到onXXX回调里写。

根据描述3的现象来判断,还是你在启动脚本里直接初始化了数据库连接或者其他连接资源,数据库、redis等应该在onXX回调里初始化。启动脚本里直接初始化数据库或者redis等资源,子进程会继承这些资源,导致互相收到影响。

看下workerman.log日志,日志没有明确内容时打开php.ini中的error_log,看error_log的日志。
或者将业务代码一半一半的注释掉,直到找到问题因为问题的代码。

robin2024

1、从新在后台运行,看起来workerman的各进程应该都正常啊,

2、执行 status查询还是有错误
PHP Warning: stream_socket_server(): Unable to connect to tcp://0.0.0.0:6569 (Address already in use) in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php on line 2360

Warning: stream_socket_server(): Unable to connect to tcp://0.0.0.0:6569 (Address already in use) in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php on line 2360
PHP Fatal error: Uncaught Exception: Address already in use in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php:2362
Stack trace:

0 /home/forex/forex-v3/Applications/forex/start_forex.php(95): Workerman\Worker->listen()

1 /home/forex/forex-v3/start.php(29): require_once('...')

2 {main}

thrown in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php on line 2362

Fatal error: Uncaught Exception: Address already in use in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php:2362
Stack trace:

0 /home/forex/forex-v3/Applications/forex/start_forex.php(95): Workerman\Worker->listen()

1 /home/forex/forex-v3/start.php(29): require_once('...')

2 {main}

thrown in /home/forex/forex-v3/vendor/workerman/workerman/Worker.php on line 2362

  • robin2024 2023-12-08

    补充一点,workerman.log 没有错误信息

walkor

发一个能重现你这个问题的启动文件 start.php,不要任何业务逻辑。注意,要能重现你这个问题的start.php,完整的启动文件,别人能运行测试的。

  • 暂无评论
robin2024

找到原因了,因为此前使用workerman的老版本,
创建worker后,会执行 $worker->listen(); 命令,在老版本没问题。
在新版本上执行 $worker->listen();命令会导致端口被占用的错误。

出现这种错误,耽误了1天时间,真是让人苦笑不得

  • robin2024 2023-12-09

    不错,在找问题过程中对workerman理解更深入了一些,
    顺便看了很牛X的 workerman AI

🔝