php如何使用多进程
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章给大家分享的是有关php如何使用多进程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码:
千家信息网最后更新 2025年11月13日php如何使用多进程
这篇文章给大家分享的是有关php如何使用多进程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
代码:
]>*/class process{public $num = 10; # 进程数public $timeout = 4; # 延迟时间public $pipedir = "pipe/"; # 管道目录public $logdir = "log/"; # 日志目录public $errlog = "err.log"; # 错误日志public $successlog = "success.log"; # 成功日志/* @desc:构造方法,创建相关目录,检察是否支持扩展 */public function __construct(){ $pipedir = $this->pipedir; $logdir = $this->logdir; if(!is_dir($pipedir)){ if(!mkdir($pipedir)){ $this->write_log(1,"创建管道目录{$pipedir}失败"); } } if(!is_dir($logdir)){ if(!mkdir($logdir)){ $this->write_log(1,"创建日志目录{$logdir}失败"); } } if (!function_exists('pcntl_fork')) { $this->write_log(1,'未安装pcntl扩展'); exit; }}/* @desc:内部方法,写日志 @param type 日志类型 1错误日志 2成功日志 @param msg 日志消息 */private function write_log($type,$msg){ $logdir = $this->logdir; $errlog = $this->errlog; $successlog = $this->successlog; $prelog = date('Y-m-d H:i:s').":"; if($type == 1){ $logname = $logdir.$errlog; }else{ $logname = $logdir.$successlog; } file_put_contents($logname,$prelog.$msg.PHP_EOL,FILE_APPEND);}/* @desc:主方法,执行程序 @param name 执行命令的回调函数 */public function run($name){ $num = $this->num; $timeout = $this->timeout; $pipedir = $this->pipedir; $pipefile = $pipedir.posix_getpid(); if (!posix_mkfifo($pipefile, 0666)) { $this->write_log(1,"创建管道文件{$pipefile}失败"); exit; } # 处理任务 for ($i = 0; $i < $num; ++$i ) { $cpid = pcntl_fork(); # 创建子进程 if ($cpid == 0) { # 子进程过程 call_user_func($name,$i); $pw = fopen($pipefile, 'w'); fwrite($pw, $i."\n"); # 当前任务处理完比,在管道中写入数据 fclose($pw); exit(0); # 执行完后退出 } } # 父进程 $pr = fopen($pipefile, 'r'); stream_set_blocking($pr, FALSE); # 将管道设置为非堵塞,用于适应超时机制 $pdata = ''; # 存放管道中的数据 $sline = 0; # 成功执行的进程数量 $stime = time(); while ($sline < $num && (time() - $stime) < $timeout) { $tline = fread($pr, 1024); if (empty($tline)) { continue; } # 用于分析多少任务处理完毕,通过'\n'标识 foreach(str_split($tline) as $v) { if ("\n" == $v) { ++$sline; } } $pdata .= $tline; } $this->write_log(2,"总共{$sline}个任务执行成功"); fclose($pr); unlink($pipefile); # 删除管道,已经没有作用了 # 等待子进程执行完毕,避免僵尸进程 $n = 0; while ($n < $num) { $status = -1; $cpid = pcntl_wait($status, WNOHANG); if ($cpid > 0) { $this->write_log(2,"进程{$cpid}执行结束"); ++$n; } } # 验证结果,主要查看结果中是否每个任务都完成了 $arr = array(); foreach(explode("\n", $pdata) as $i) { if (is_numeric(trim($i))) { array_push($arr, $i); } } $arr = array_unique($arr); if ( count($arr) == $num) { $this->write_log(2,var_export($arr,true)); } else { $this->write_log(1,"执行成功数量:".count($arr)); $this->write_log(1,"执行成功的线程:".var_export($arr,true)); }}}测试:
$process = new process();$process->num = 5; # 修改进程数为5$process->run('todo');/*@desc:真实处理业务的方法@param pid 进程id*/function todo($pid){$num = 19; # 总任务数$anum = ceil($num/5); # 平均每个进程处理任务数$lnum = $num - $anum*(5-1); # 最后一个进程处理任务数$minnum = $anum*$pid; # 当前进程处理的最小值$maxnum; # 当前进程处理的最大值if($pid<(5-1)){ $maxnum = $minnum + $anum;}else{ $maxnum = $num;}for($i=$minnum;$i<$maxnum;$i++){ echo "进程号:{$pid};输出:{$i}".PHP_EOL;}}输出:
进程号:1;输出:4进程号:1;输出:5进程号:1;输出:6进程号:1;输出:7进程号:2;输出:8进程号:2;输出:9进程号:2;输出:10进程号:2;输出:11进程号:3;输出:12进程号:3;输出:13进程号:3;输出:14进程号:3;输出:15进程号:4;输出:16进程号:4;输出:17进程号:4;输出:18进程号:0;输出:0进程号:0;输出:1进程号:0;输出:2进程号:0;输出:3
感谢各位的阅读!关于"php如何使用多进程"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
进程
输出
日志
处理
任务
管道
成功
目录
方法
内容
数据
数量
更多
篇文章
结果
错误
不错
实用
最大
最小
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
银川网络安全白盒测试
承德联通公司老居宅数据库
网络安全密钥在哪里找新电脑
嘉元网络技术
双流网络安全协会
网络安全法处罚上限
使用数据库承诺书
服务器网易云自动签到
知网数据库下架
vm服务器操作系统
什么叫互联网高科技类
要如何增强网络安全意识
服务器跑代码跑一会就停了
黄河服务器2280
重庆手机软件开发工具
四川话配音软件开发
湖南通化网络技术有限公司
佳缘科技互联网医院
数据库修改视图中某学生的信息
网警说数据库数据泄漏
我的世界多人服务器生存20期
方舟服务器航海王模组
datagrid数据库
河南晨飞互联网科技
软件开发控制计划
计算机网络技术的专业月薪
学软件开发的五年大专
误删数据库找回来
网络安全相关的专业有哪些
数据库网状模型怎么实现