PHP多进程处理并行处理任务实例
2019独角兽企业重金招聘Python工程师标准>>>
本文目的
本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。写得比较简单,作为备忘录。
PHP多进程
通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!
管道PIPE
管道用于承载简称之间的通讯数据。为了方便理解,可以将管道比作文件,进程A将数据写到管道P中,然后进程B从管道P中读取数据。php提供的管道操作API与操作文件的API基本一样,除了创建管道使用posix_mkfifo函数,读写等操作均与文件操作函数相同。当然,你可以直接使用文件模拟管道,但是那样无法使用管道的特性了。
僵尸进程
子进程结束时,父进程没有等待它(通过调用wait或者waitpid),那么子进程结束后不会释放所有资源(浪费呀!),这种进程被称为僵尸进程,他里面存放了子进程结束时的相关数据,如果僵尸进程过多,会占用大量系统资源(如内存),影响机器性能。
代码
废话少说直接上代码
/**
* this is a demo for php fork and pipe usage. fork use
* to create child process and pipe is used to sychoroize
* the child process and its main process.
* @author bourneli
* @date: 2012-7-6
*/
define(
"PC"
, 10);
// 进程个数
define(
"TO"
, 4);
// 超时
define(
"TS"
, 4);
// 事件跨度,用于模拟任务延时
if
(!function_exists(
'pcntl_fork'
)) {
die
(
"pcntl_fork not existing"
);
}
// 创建管道
$sPipePath
=
"my_pipe."
.posix_getpid();
if
(!posix_mkfifo(
$sPipePath
, 0666)) {
die
(
"create pipe {$sPipePath} error"
);
}
// 模拟任务并发
for
(
$i
= 0;
$i
< PC; ++
$i
) {
$nPID
= pcntl_fork();
// 创建子进程
if
(
$nPID
== 0) {
// 子进程过程
sleep(rand(1,TS));
// 模拟延时
$oW
=
fopen
(
$sPipePath
,
'w'
);
fwrite(
$oW
,
$i
.
"\n"
);
// 当前任务处理完比,在管道中写入数据
fclose(
$oW
);
exit
(0);
// 执行完后退出
}
}
// 父进程
$oR
=
fopen
(
$sPipePath
,
'r'
);
stream_set_blocking(
$oR
, FALSE);
// 将管道设置为非堵塞,用于适应超时机制
$sData
=
''
;
// 存放管道中的数据
$nLine
= 0;
$nStart
= time();
while
(
$nLine
< PC && (time() -
$nStart
) < TO) {
$sLine
=
fread
(
$oR
, 1024);
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
= 0;
while
(
$n
< PC) {
$nStatus
= -1;
$nPID
= pcntl_wait(
$nStatus
, WNOHANG);
if
(
$nPID
> 0) {
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
);
}
ok,完毕,注释写的比较清除,执行结果如下:
转载于:https://my.oschina.net/u/247923/blog/282663
PHP多进程处理并行处理任务实例相关推荐
- python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解
本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU ...
- LINUX 多进程编程 C语言实例
LINUX多进程编程 简单实例 1.ps与top命令 查看进程状态 2.系统调用ping,并执行 #include <stdio.h> #include <string.h> ...
- python多进程编程实例_Python多进程编程multiprocessing代码实例
下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 import multiprocessing import time def get_html(n): time.slee ...
- Nodejs【单机】多进程模式集群
Nodejs[单机]多进程模式集群实例: 1.安装:npm install -s cluster 2.服务代码: var debug = require('debug'); var express = ...
- php多进程有什么用,有关php多进程的用法举例
在php中实现多进程,一般有两种方法,一种是使用PHP自带的pcntl_*函数(仅限linux),另一种就是使用popen/proc_open,然后在php内部控制进程数量. 使用pcntl_*函数 ...
- Linux多进程编程(2)
简介 IPC(Inter Process Communication,进程间通信)的方式总共有三种,分别是信号量.共享内存和消息队列,本文介绍前两种. 在Linux中,进程之间操作公共数据时,需要进行 ...
- 什么?Python的多进程居然比单进程慢?
导读 很多时候,当我们需要使用Python来处理大量的数据的时候,为了缩短处理的时间,我们会使用多线程或多进程来并行处理任务. 由于Python全局解释器锁的存在,导致在执行多线程的时候实际上只有一个 ...
- PHP多进程协作编程之-popen
使用popen结合SHELL命令也可以实现多进程并发编程. 实例如下: <?php //b.php文件 $file = 'testdir/file.txt'; for ($i=0;$i<1 ...
- Python——多线程与多进程
Python--多线程与多进程 学习python进阶能力,多进程与多线程的能力是必须的,不然真out了.以下内容部分摘自博客:Python 多线程与多进程.Python:多线程及多进程的使用. 一.线 ...
最新文章
- asp.net mvc 学习
- LeetCode House Robber III(动态规划)
- .Net Core中使用Quartz.Net Vue开即用的UI管理
- 2021.08.25学习内容torch.clamp(input, min, max, out=None) → Tensor,torch.mm(matrix multiply)
- 大数据预测实战-随机森林预测实战(三)-数据量对结果影响分析
- linux虚拟机中安装java软件,在 Linux 中安装 JAVA 虚拟机
- 医药电商为何发展不起来?
- python编程怎么命名_命名规范-python编程入门系列图文教程 - Python学习网
- ILSpy反编译工具的使用
- java调用数据库存储过程的接口是_JAVA调用数据库存储过程
- FPGA芯片手册阅读技巧
- java 小票打印机和触发开钱箱操作
- 单片机原理及应用 张鑫_单片机原理及应用
- 双拼输入法软件测试,为什么推荐你使用双拼输入法?
- WOW 最简单的插件入门,适合不知道怎么创建XML/自己写的插件始终不生效的
- 这些带斑点的蛇实在太漂亮了,盘点18种带斑点的蛇
- 用HTML+CSS做一个简单好看的环保网页
- [MySQL]初始JDBC编程
- NB模块-QS100-默认demo
- 残躯演绎完美爱情 浙江“轮椅夫妻”温暖千万网友
热门文章
- 谈谈对MVC的理解(View+Model+Controller)
- 深圳市收运体系运营管理_华为公司质量管理体系构建和运营实践
- python getattr函数_Python中的getattr()函数详解
- oracle驱动maven报错_在Maven仓库中添加Oracle JDBC驱动
- mysql2012更改表名_T-SQL入門攻略之13-修改数据表
- 市面上有哪几种门_选择 low-e门窗玻璃,你想知道的都在这了
- imeoptions android,软键盘小记Android:imeOptions
- retrofit 2.0 android 教程,初识Retrofit2.0
- 怎样用mysql查询测试_如何测试数据库查询优化器
- 商场楼层导视牌图片_百宝图商场电子导视软件中预约产品功能简介