php多进程和守护进程的执行器,只支持在命令行运行。
由于项目使用了pcntl_async_signals
函数做信号分发,所以要求你的php版本>=7.1。
进程控制流程
send SIGUSR1 -> /process1 \
^ / process2 \
master ------------ process3 SIGUSR1 exit(1)
^ \ process4 /
| \process5 /
|send SIGTERM
|
kill
-
php >= 7.1
-
pcntl扩展
-
posix扩展
composer require icy8/process
-
多进程模型
如果master进程被
kill
,子进程也会被强制退出。<?php use icy8\process\Worker; $handle = new Worker(); $handle->total = 2;// 需要运行的进程数 // $handle->max = 10;// 允许同一时间打开的进程数上限 0为无上限;通常建议设定一个大于零的数值 $handle->run(function ($worker) { // 闭包里是你的业务代码 while (1) { var_dump(time()); sleep(1); } });
自由分配每个进程的工作逻辑:
<?php use icy8\process\Worker; $handle = new Worker(); $processes = [ function () { while (1) { var_dump('process 1'); sleep(1); } }, function () { while (1) { var_dump('process 2'); sleep(1); } }, function () { while (1) { var_dump('process 3'); sleep(1); } }, function () { while (1) { var_dump('process 4'); sleep(1); } }, ]; // 此时你不再需要手动配置$handle->total属性 $handle->run($processes);
-
守护进程模型
守护进程在制作过程中已经将标准输出重定向到
/dev/null
。执行:
php daemon.php --start|stop|status
<?php use icy8\process\Daemon; $daemo = new Daemon(); $daemon->run(function () { sleep(10); });
如果你想要更自由一些:
<?php use icy8\process\Daemon; $daemon = new Daemon(); $daemon->start(); // 所有业务逻辑写在下面 // 此时的脚本文件不再自动支持 --start|stop|status参数 $i = 0; while($i < 10) { $i++; var_dump($i); }
-
多进程结合守护进程使用
这种模式下,通常多进程模型中的master进程就是当前的守护进程。
<?php use icy8\process\Worker; use icy8\process\Daemon; $daemon = new Daemon(); //$daemon->pidFile = '/www/test.pid';// 允许自定义一个存放进程id的文件路径,一定要设置绝对路径 $daemon->run(function () { // 放到守护进程运行 $handle = new Worker(); $handle->total = 2; $handle->run(function ($worker) { while (1) { var_dump(time()); sleep(1); } }); });