建议 Workerman 增加自定义命令的支持

pader

现在只要敲下 php start.php custom 后面不是 Workerman 指定的几个命令,就会出现:

php start.php custom
Usage: php yourfile <command> [mode]
Commands:
start           Start worker in DEBUG mode.
                Use mode -d to start in DAEMON mode.
stop            Stop worker.
                Use mode -g to stop gracefully.
restart         Restart workers.
                Use mode -d to start in DAEMON mode.
                Use mode -g to stop gracefully.
reload          Reload codes.
                Use mode -g to reload gracefully.
status          Get worker status.
                Use mode -d to show live status.
connections     Get worker connections.

希望 Workerman 新增一些自定义命令的方式,比如:

Worker::addCommand('custom', function() {
    new MyOtherServer();
    Worker::runAll();
}, 'Custom command information.');
2854 2 0
2个回答

walkor

workerman命令机制并不是想象的那么简单。它涉及到启动脚本进程、主进程、子进程之前的相互通讯。
比如status命令,就是启动脚进程判断是status命令,然后给主进程发送某个信号,主进程收到信号后把主进程掌握的信息写入磁盘,然后把信号发给所有子进程,子进程将自己的状态写入到磁盘,然后脚本进程读取磁盘数据输出结果。

绝大部分php开发人员没有多进程编程经验,或者对workerman进程模型不了解,无法考虑周全。比如new MyOtherServer();,它应该运行在脚本进程、主进程、还是子进程一般开发者都不清楚。从而导致workeman不可预期的行为。

  • pader 2020-12-16

    这个 MyOtherServer() 就是一个 Worker,这里的意思就是通过不同的参数启动不同的 Worker,或者能够自己获取自定义传参,从而判断实例化哪个 Worker 来实现不同的命令。
    或者支持 start 之后的参数,比如 php start.php start mycustom cli param,然后在程序里可以通过 Worker::getCustomParam() 之类的来获取参数来做一些特殊的操作。

  • walkor 2020-12-16

    这个简单,通过 $argv 来获得参数。例如下面通过参数传递要监听的端口,命令为 “php start.php start 端口号”。实现代码是
    $worker = new Worker('http://0.0.0.0:'.$argv[2]);

pader

我现在碰到一个问题,就是我需要通过启动 Workerman 处理一些事情,这些事情可能要处理几秒钟,也可能几分钟,希望处理完成后就退出相关的进程,任务结束了。

然而 Workerman 似乎并不支持相关的操作,比如在 onWorkerStart 中有一个 Timer::add() 在定时器内部是 Worker::stopAll(),然而这个 stopAll 并不是终止 Workerman,而是重启所有子进程。

现在有什么办法可以启动临时性的进程来执行任务?

  • walkor 2021-07-06

    调用 posix_kill(posix_getppid(), SIGINT); 来停止workerman。

年代过于久远,无法发表回答
🔝