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 ...
随机推荐
- apache配置域名访问本地空间
1. 首先修改C盘WINDOWS\system32\drivers\etc目录下的 hosts 文件,用记事本打开,加入: 127.0.0.1 www.a.com hosts文件是用来解析的,你在浏览 ...
- Android Tab与TabHost
这就是Tab,而盛放Tab的容器就是TabHost 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了.一个Activity,对应了多个功能布局. ①新建一个Tab项目,注意,不要生成mai ...
- 浅谈搜索引擎SEO(HTML/CSS)
SEO:搜索引擎优化(免费): SEM:搜索引擎营销(付费). 它们两者的区别是: 1.SEM高投入,SEO低投入: 2.SEM短.效益块,SEO长期投入.增长慢: 3.新广告法颁布之后SEM广告位减 ...
- maven(18)-mybatis generator插件
generator的作用 使用mybatis框架,在初始项目或修改数据库时,相应的要在JAVA项目中去写一些数据模型文件,DAO,映射XML等配置,而这个插件的作用就是自动生成这些文件,以节省大 ...
- vue从安装到初始化项目
- 外部读取Excel的两种方法
1.使用Epplus读取 下载地址为https://epplus.codeplex.com/,下载文件后引用Epplus.dll文件. 这个类库读取Excel方便快捷,但是它只能读取.xlsx类型的文 ...
- December 12th 2016 Week 51st Monday
Nothing is impossible for a willing heart. 心之所愿,无所不成. I wish I can be a strong, clever, powerful and ...
- pyenv - python版本管理
1. 安装pyenv brew install pyenv 2. 安装python其它版本(如:python 3.6.7) pyenv install --list #查看可以安装的python版本 ...
- pip 使用国内镜像源加速
现在做开发可是真的不容易,好像不论哪一个语言当你使用到包管理工具的时候都要进行一些网络的配置,否则速度慢如龟,无论是 maven 还是 npm 又或者是我们要说的 pip. 更换国内的源好像已经是必备 ...
- SQL监控:mysql及mssql数据库SQL执行过程监控审计
转载 Seay_法师 最近生活有很大的一个变动,所以博客也搁置了很长一段时间没写,好像写博客已经成了习惯,搁置一段时间就有那么点危机感,心里总觉得不自在.所以从今天起还是要继续拾起墨笔(键盘),继续好 ...