现在只要敲下 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.');
workerman命令机制并不是想象的那么简单。它涉及到启动脚本进程、主进程、子进程之前的相互通讯。
比如status命令,就是启动脚进程判断是status命令,然后给主进程发送某个信号,主进程收到信号后把主进程掌握的信息写入磁盘,然后把信号发给所有子进程,子进程将自己的状态写入到磁盘,然后脚本进程读取磁盘数据输出结果。
绝大部分php开发人员没有多进程编程经验,或者对workerman进程模型不了解,无法考虑周全。比如
new MyOtherServer();
,它应该运行在脚本进程、主进程、还是子进程一般开发者都不清楚。从而导致workeman不可预期的行为。这个 MyOtherServer() 就是一个 Worker,这里的意思就是通过不同的参数启动不同的 Worker,或者能够自己获取自定义传参,从而判断实例化哪个 Worker 来实现不同的命令。
或者支持 start 之后的参数,比如 php start.php start mycustom cli param,然后在程序里可以通过 Worker::getCustomParam() 之类的来获取参数来做一些特殊的操作。
这个简单,通过 $argv 来获得参数。例如下面通过参数传递要监听的端口,命令为 “php start.php start 端口号”。实现代码是
$worker = new Worker('http://0.0.0.0:'.$argv[2]);
我现在碰到一个问题,就是我需要通过启动 Workerman 处理一些事情,这些事情可能要处理几秒钟,也可能几分钟,希望处理完成后就退出相关的进程,任务结束了。
然而 Workerman 似乎并不支持相关的操作,比如在 onWorkerStart 中有一个 Timer::add() 在定时器内部是 Worker::stopAll(),然而这个 stopAll 并不是终止 Workerman,而是重启所有子进程。
现在有什么办法可以启动临时性的进程来执行任务?
调用 posix_kill(posix_getppid(), SIGINT); 来停止workerman。