--------进程通讯 场景 父子进程通讯
https://wiki.swoole.com/wiki/page/214.html
<?php use Swoole\Process; echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID cli_set_process_title("mymain"); //设置了进程名称 $child1=new Process(function(Process $p){ while(true){ sleep(1); $p->write("[进程1:12345]"); echo "进程1发送数据:[进程1:12345]".PHP_EOL; } },false,1,true); $child1->start(); $child2 = new Process(function(Process $p){ while(true){ // usleep(0.5*1000*1000); sleep(0.5); echo "进程2获取数据:".$p->read().PHP_EOL; } }); $child2->start(); while(true){ $child1_data = $child1->read(); $child2->write($child1_data); sleep(1); } Process::signal(SIGCHLD, function($sig) { //必须为false,非阻塞模式 while($ret = Process::wait(false)) { var_dump($ret); } });
[root@bogon swoole]# php7 ./poll.php 当前进程ID:2409 进程1发送数据:[进程1:12345] 进程2获取数据:[进程1:12345] 进程1发送数据:[进程1:12345] 进程2获取数据:[进程1:12345] 进程1发送数据:[进程1:12345] 进程2获取数据:[进程1:12345] 进程1发送数据:[进程1:12345] 进程2获取数据:[进程1:12345] 进程1发送数据:[进程1:12345] 进程2获取数据:[进程1:12345]
队列queue
<?php use Swoole\Process; echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID cli_set_process_title("mymain"); //设置了进程名称 $child1=new Process(function(Process $p){ while(true){ sleep(3); for($i = 0 ;$i<=5;$i++){ $p->push($i); } } },false,1,true); $child1->useQueue(1,2); $child1->start(); $child2 = new Process(function(Process $p){ while(true){ sleep(0.5); echo "进程2获取数据:".$p->pop().PHP_EOL; } },false,1,true); $child2->useQueue(1); $child2->start(); $child3 = new Process(function(Process $p){ while(true){ sleep(0.5); echo "进程3获取数据:".$p->pop().PHP_EOL; } },false,1,true); $child3->useQueue(1); $child3->start(); Process::signal(SIGCHLD, function($sig) { //必须为false,非阻塞模式 while($ret = Process::wait(false)) { var_dump($ret); } });
[root@bogon swoole]# php7 ./poll.php 当前进程ID:2735 进程2获取数据:0 进程2获取数据:2 进程2获取数据:3 进程2获取数据:4 进程2获取数据:5 进程3获取数据:1 进程2获取数据:0 进程2获取数据:2 进程2获取数据:3 进程2获取数据:4 进程2获取数据:5 进程3获取数据:1 进程2获取数据:0 进程2获取数据:2 进程2获取数据:3 进程2获取数据:4 进程2获取数据:5 进程3获取数据:1 进程2获取数据:0 进程2获取数据:2 进程2获取数据:3 进程2获取数据:4 进程2获取数据:5 进程3获取数据:1
执行 外部程序
<?php require "vendor/autoload.php"; use Swoole\Process; use Swoole\Coroutine\Mysql as MySQL; echo "当前进程ID:".posix_getpid().PHP_EOL; //获取了进程ID cli_set_process_title("mymain"); //设置了进程名称 $child1=new Process(function(Process $p){ $p->exec("/application/php7/bin/php",['./test.php']); },true,0,true); $child1->start(); while(true){ $ret=$child1->read(); echo $ret; usleep(0.5*1000*1000); } Process::signal(SIGCHLD, function($sig) { //必须为false,非阻塞模式 while($ret = Process::wait(false)) { //var_dump($ret); } });
crontab表达式

<?php date_default_timezone_set('PRC'); //设置中国时区 require_once 'vendor/autoload.php'; $config=[ "job1"=>[ "cron"=> Cron\CronExpression::factory('* * * * *'), "func"=>function(){ echo "job1".date("Y-m-d h:i").PHP_EOL; }, "current"=>date("Y-m-d H:i"), "nth"=>0 ] ]; while(true){ foreach($config as $key=>&$value){ $cron=$value["cron"]; $func=$value["func"]; $current=$value["current"]; $nth=$value['nth']; $time=$cron->getNextRunDate($value["current"],$nth,false)->getTimestamp()-strtotime(date("Y-m-d H:i")); if($time===0){ //执行业务逻辑 $func(); $value['nth']=$value['nth']+1; } } sleep(1); }
多进程创建任务并回收
<?php use Swoole\Process; cli_set_process_title("mymaster"); $manger = new Process(function(Process $process){ cli_set_process_title("mymanager"); while(true){ sleep(0.1); $process->write(json_encode(["a"=>123,"b"=>456])); Process::kill(posix_getppid(),SIGUSR1); } },false,1); $manger->start(); Process::signal(SIGUSR1, function($sig) use($manger) { $data[] = $manger->read(); $child=new Process(function(Process $process) use($data){ sleep(1); echo $data.PHP_EOL; }); $child->start(); }); Process::signal(SIGCHLD, function($sig) { //必须为false,非阻塞模式 while($ret = Process::wait(false)) { //var_dump($ret); } });
上述代码 无法会不断开启进程执行任务 需要新方案改进
swoole4.4.x之后子进程回收代码的问题处理:
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/11487270.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能