php多进程编程实现与优化
PHP多进程API
创建子进程
@params void
@returns int
int pcntl_fork(void)
成功时,在父进程执行线程内返回产生的子进程PID,在子进程执行线程内返回0,失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个php错误
获取当前进程id
@params void
@returns int
int posix_getpid(void)
返回进程id,类型为整型
父进程等待子进程退出
@params $status
@params $option
@return bool
int pcntl_wait(int &$status[,int $options=0])
该函数等同于以-1作为参数pid的值并且没有options参数来调用pcntl_waitpid()的函数
进程退出状态
@params $status
@return bool
bool pcntl_wifexited(int $status)
进程退出码
@params $status
@return int
int pcntl_wexitstatus(int $status)
简单PHP多进程示例
function process_execute($input) {
$pid = pcntl_fork(); //创建子进程
if ($pid == 0) {//子进程
$pid = posix_getpid();
echo "* Process {$pid} was created, and Executed:\n\n";
eval($input); //解析命令
exit;
} else {//主进程
$pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
if (pcntl_wifexited($status)) {
echo "\n\n* Sub process: {$pid} exited with {$status}";
}
}
通过调用php创建子进程接口完成一个子进程的创建,pcntl_fork返回值为0证明进入到子进程内,非0则进入到父进程内部,-1则父进程创建子进程失败。
多个子进程初级版本示例
foreach ($clusterList as $key=>$value) {
$pid = pcntl_fork();//创建子进程
if($pid == 0) {//子进程
//do something
} else if($pid == -1) {
//fork error occured
} else {
pcntl_wait($status);
}
}
该实现方式主要逻辑为循环创建一个子进程,并且父进程等待子进程完成退出后,再继续创建下一个子进程
缺点:无法真正体现多进程,实际上时串行的创建子进程
多个子进程优化版本示例
foreach ($clusterList as $key=>$value) {
$pid = pcntl_fork();//创建子进程
if($pid == 0) {//子进程
//do something
} else if($pid == -1) {
return false;
}
}
for (;;) {
$ret = pcntl_waitpid(-1,$status,WNOHANG);
if ($ret == -1) {
// error occured
} else if ($ret == 0) {
//all child are existed
break;
} else {
//check sub process exit status
$extFlag = pcntl_wifexited($status);
if(!$extFlag){
//exited unnormally
}else {
$extCode = pcntl_wexitstatus($status);
//exited normally
}
}
}
该逻辑通过for循环不断获取子进程的退出状态,直到所有的子进程都退出,真正实现多进程处理。
php多进程编程实现与优化的更多相关文章
- 浅谈自底向上的Shell脚本编程及效率优化
作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...
- PHP多进程编程实例
这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...
- Python多进程编程
转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...
- Linux下的多进程编程
1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...
- Android 多进程编程 15问15答!
ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...
- 嵌入式linux多进程编程
嵌入式linux多进程编程 在主程序显示文本菜单.提供例如以下服务.要求每一个服务都通过生成子进程来提供. 服务包含:日历信息显示,日期信息显示,推断闰年服务,文件复制功能,数字排序功能.退出功能. ...
- Linux高性能server规划——多进程编程
多进程编程 多进程编程包含例如以下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及怎样避免僵尸进程 进程间通信(Inter-Process Communic ...
- php多进程编程详解
php多进程编程 前言 php单进程存在的问题: 多核处理器未充分利用,而单处理器通常需要等待其他操作完成之后才能再继续工作. 任何现代操作系统都可在幕后执行多任务,这意味着在很短时间内,计算机可以调 ...
- 【转】Python多进程编程
[转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...
随机推荐
- Vue使用html2Canvas和canvas2Image下载二维码会模糊的问题解决方法
// 下载二维码图片的方法 saveImg() { var self = this; html2canvas(document.querySelector(".savePic"), ...
- react项目 路径优化
- 自定义动画(仿Win10加载动画)
一.源代码 源代码及demo 二.背景 先看看Win10的加载动画(找了很久才找到): CPA推广甲爪广告联盟满30日结 [点击进入] 甲爪广告联盟,提供各类高单价CPA广告 单价高 收益好 日付广告 ...
- 一、angularjs基础了解
说明:此处比较杂,目前没有统一的总结哦 angularjs 是mvvm框架 加载JS文件总是使用后缀为.min.js的文件,因为这些文件是经过压缩的,能提升应用的启动速度 模块说明: 1.config ...
- Vue之自定义组件的v-model
最近在学习vue,今天看到自定义事件的表单输入组件,纠结了一会会然后恍然大悟...官方教程写得不是很详细,所以我决定总结一下. v-model语法糖 v-model实现了表单输入的双向绑定,我们一般是 ...
- 初识Spark程序
执行第一个spark程序 普通模式提交任务: bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master spark ...
- 读取本地IP地址和子网页码
#region 读取本地IP地址和子网页码 //读取本地IP地址和子网页码 NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterf ...
- ajax实现跨域提交
因为现在一直用的mvc,所以就以mvc来说说ajax跨域提交. 首先说说跨域,简单说就是不同域名访问,比如在aaa.com访问bbb.com. 就拿招聘网站来说,分为两种用户,求职者和企业,求职者端是 ...
- Gdb调试工具/ Makfile项目管理
gdb调试工具 gcc -g main.c -o main 常用命令 命令 简写 作用 help h 按模块列 ...
- 内置的HTTP服务器【Modern PHP】
目录 启动服务器 配置服务器 路由器脚本 判断是否为内置的服务器 PHP5.4.0起,PHP内置了Web服务器.对本地开发是个极好的工具,便捷,无需安装WAMP.XAMP或大新那个web服务器,就能在 ...