PHP多进程处理并行处理任务实例(转,备用)
本文目的
本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。
PHP多进程
通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!
管道PIPE
管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。
僵尸进程
子进程结束时,父进程没有等待它(通过调用wait或者waitpid),那么子进程结束后不会释放所有资源(浪费呀!),这种进程被称为僵尸进程,他里面存放了子进程结束时的相关数据,如果僵尸进程过多,会占用大量系统资源(如内存),影响机器性能。
代码
<?php
define("PC", ); // 进程个数
define("TO", ); // 超时
define("TS", ); // 事件跨度,用于模拟任务延时
if (!function_exists('pcntl_fork')) {
die("pcntl_fork not existing");
}
// 创建管道
$sPipePath = "my_pipe.".posix_getpid();
if (!posix_mkfifo($sPipePath, )) {
die("create pipe {$sPipePath} error");
}
// 模拟任务并发
for ($i = ; $i < PC; ++$i ) {
$nPID = pcntl_fork(); // 创建子进程
if ($nPID == ) {
// 子进程过程
sleep(rand(,TS)); // 模拟延时
$oW = fopen($sPipePath, 'w');
fwrite($oW, $i."\n"); // 当前任务处理完比,在管道中写入数据
fclose($oW);
exit(); // 执行完后退出
}
}
// 父进程
$oR = fopen($sPipePath, 'r');
stream_set_blocking($oR, FALSE); // 将管道设置为非堵塞,用于适应超时机制
$sData = ''; // 存放管道中的数据
$nLine = ;
$nStart = time();
while ($nLine < PC && (time() - $nStart) < TO) {
$sLine = fread($oR, );
if (empty($sLine)) {
continue;
}
echo "current line: {$sLine}\n";
// 用于分析多少任务处理完毕,通过‘\n’标识
foreach(str_split($sLine) as $c) {
if ("\n" == $c) {
++$nLine;
}
}
$sData .= $sLine;
}
echo "Final line count:$nLine\n";
fclose($oR);
unlink($sPipePath); // 删除管道,已经没有作用了
// 等待子进程执行完毕,避免僵尸进程
$n = ;
while ($n < PC) {
$nStatus = -;
$nPID = pcntl_wait($nStatus, WNOHANG);
if ($nPID > ) {
echo "{$nPID} exit\n";
++$n;
}
}
// 验证结果,主要查看结果中是否每个任务都完成了
$arr2 = array();
foreach(explode("\n", $sData) as $i) {// trim all
if (is_numeric(trim($i))) {
array_push($arr2, $i);
}
}
$arr2 = array_unique($arr2);
if ( count($arr2) == PC) {
echo 'ok';
} else {
echo "error count " . count($arr2) . "\n";
var_dump($arr2);
}
# time php fork.php
current line: current line: current line: current line: current line: Final line count:
exit
exit
exit
exit
exit
exit
exit
exit
exit
exit
error count
array() {
[]=>
string() ""
[]=>
string() ""
[]=>
string() ""
[]=>
string() ""
[]=>
string() ""
} real 0m4.199s
user 0m1.840s
sys 0m1.554s
摘自:https://blog.csdn.net/u014511737/article/details/47003885
PHP多进程处理并行处理任务实例(转,备用)的更多相关文章
- PHP多进程处理并行处理任务实例
本文目的 本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步.写得比较简单,作为备忘录. PHP多进程 通过pcntl_XXX系列函数使用多进程功能 ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- IOS开发教程之put上传文件的服务器的配置及实例分享-备用
感谢大神分享 1,HTTP常见的方法 GET 获取指定资源 POST 2M 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源 HEAD 获取指定资源头部信息PUT 替换指定资源(不支 ...
- socketserver 多进程、多线程应用实例
1.线程池,ThreadingTCPServer #coding=utf-8 ''' 可并发,客户端互不影响,可以保持长连接,客户端发送消息 也不要求加 \r\n ''' #线程池(windows 可 ...
- php多进程和多线程的比较
前言 最近在学习php多进程和多线程的编程.说实话,这两样在工作中几乎都没有用到,毕竟php并不以异步处理擅长,对于网络请求同步处理可以解决绝大多数问题.但是既然有这样的机制,也了解一下,对于以后接触 ...
- 有用PHP依赖管理工具Composer新手教程
PHP依赖管理工具Composer新手教程 Composer 是 PHP 的一个依赖管理工具.它同意你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 依赖管理 Composer 不是一个包管理 ...
- 基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
学习环境: 操作系统 IP地址 主机名 软件包 备注 CentOS7.5 192.168.200.111 localhost 实验初始配置:所有主机关闭防火墙与selinux [root@ ...
- asp.net core系列 27 EF模型配置(索引,备用键,继承)
一.索引 索引是许多数据存储中的常见概念.虽然它们在数据存储中的实现可能会有所不同,但它们可用于更有效地基于列(或列集)进行查找.按照约定,用作外键每个属性 (或组的属性) 会自动创建索引.无法使用数 ...
- uwsgi多进程配合kafka-python消息无法发送
在工作中,使用uwsgi部署项目,其中uwsgi设置为多进程,并且python中使用了kafka-python模块作为生产者不断产生数据,但上线不久后几乎所有的生产者消息都报:KafkaTimeout ...
随机推荐
- JAVA中域、方法、类的可见性
多态在域的问题上是特殊的.我理解不了中文版的书直接叫域,看了英文原版,原版写的是fields,直接翻译虽然没错,但是出问题的变量不是域.特地查了what is the meaning of field ...
- 寻找 IBatisNet 批量插入(批量复制) 的心路历程
1.IBatisNet本身就是一个比较早的ORM框架,再加上是从java iBatis移值过来的,其流行程度不是特别高资料也不是很多(一年前),不过最近好像搜索比较多了一些(可能是训练的结果吧) 2. ...
- POJ-2018 Best Cow Fences(二分加DP)
Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10174 Accepted: 3294 Desc ...
- Oracle管理监控之如何对数据库进行监控检查
oracle自动工作负载库(AWR):采集与性能相关的统计数据,并从统计的数据中导出性能量度,以跟踪数据库潜在的问题. 如何生成oracle数据库的自动负载库报告. 手工生成一份oracle数据库的快 ...
- Oracle体系结构之联机日志文件管理
日志文件分类:重做日志文件 归档日志文件 警告日志文件 跟踪日志文件 redo_log_file文件作用: 1)维护数据一致性 2)记录了数据库里的更改操作 redo_log_friles以组为单位, ...
- 《MYSQL必知必会》
1. 同一个数据库中不允许出现同名表:不同的数据库中可以出现同名表2. 每一行记录都用有一个key(一列或一组列作为key)3. 作为key的列不允许值为空(NULL)4. 多个列作为key时,多个列 ...
- JQUERY中各个ajax函数
1.$(selecter).load() --- load() 方法从服务器加载数据,并把返回的数据放入被选元素中 2.$.get(url,callback()) 3.$.post(url,d ...
- win7系统注册表的权限修改
重装win7系统后,安装软件时提示注册表项拒绝访问 解决方法: 输入“Gpedit.msc”后回车,打开“组策略”.然后,依次展开“用户配置→管理模板→系统”,双击右侧窗口中的“阻止访问注册表编辑工具 ...
- AT2043 AND Grid 构造
正解:构造 解题报告: 传送门传送门! 这题psj讲了俩做法,一个是最常见的解法,还一种还不知道484对的QAQ 然后先把psj讲的不知正确性的做法港下QwQ 大概就是说,第一个图,先把底给染完 然后 ...
- 【Pyton】【小甲鱼】正则表达式(一)
正则表达式学习: >>> import re >>> re.search(r'FishC','I love FishC.com!') <_sre.SRE_Ma ...