CLI下另一种多进程实现方式----PCNTL
有些时候,你需要对一些脚本进行优化,以期跑的更快,在更短的时间内完成任务。PCNTL是一个不错的选择,它可以fork多个进程,来协同完成一个任务,理论上完成的时间将会和进程数成反比。
不过,PCNTL只能用于CLI模式下,不能用于Web服务器环境,否则可能会带来意料之外的错误,不推荐使用。
- 安装PCNTL扩展:
wget http://cn2.php.net/distributions/php-5.3.27.tar.bz2
tar -jxvf php-5.3.27.tar.bz2
cd php-5.3.27/ext/pcntl/
phpize && ./configure && make install
echo "extension=pcntl.so" >> /application/php5.3.27/lib/php.ini
kill -USR2 `cat /var/run/php-fpm.pid`
下载->解压->编译->添加扩展模块->重启php-fpm注意:线上web服务器中,PHP编译时已经集成该函数,不需要再单独添加,否则会报warning。
- 程序实例:

程序流程在注释中已经比较详细的说明了,这里不再单独叙述。 - 执行结果:

从结果中可以看出来,虽然程序中fork子进程是有序的,但是在实际执行中并不一定是有序的,进程完成的顺序与进程开始的顺序也不是保持一致的。
fork前,子进程可以继承父进程的东西,但是在pcntl_fork()后子进程和父进程就没有任何继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的,可以完全看成是两个独立的进程。
fork后,程序出了分岔,派生出了两个进程,具体哪个先运行,哪个先结束就看该系统的调度算法了。 - demo
<?php
/**
* pcntl test
* @author: xxxx
*/ set_time_limit(0); //如果找不到pcntl_fork函数,直接退出
if (! function_exists('pcntl_fork')) echo "PCNTL functions not available on this PHP installation\n"; //脚本运行开始
$start = time();
echo "\nSCRIT RUN AT: ", date('Y-m-d H:i:s', $start), "\n"; //从CLI取参数
//默认跑10个进程
$pmax = empty($argv[1]) ? 10 : $argv[1];
//父进程pid
$ppid = getmypid();
for ($i = 1; $i <= $pmax; ++$i) {
//开始产生子进程
$pid = pcntl_fork();
switch ($pid) {
case -1:
// fork失败
echo "Fork failed!\n";
break;
case 0:
// fork成功,并且子进程会进入到这里
sleep(1);
$cpid = getmypid(); //用getmypid()函数获取当前进程的PID
echo "FORK: Child #{$i} #{$cpid} is running...\n";
//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
exit($i);
break;
default:
// fork成功,并且父进程会进入到这里
if ($i == 1) {
echo "Parent #{$ppid} is running...\n";
}
break;
}
} //父进程利用while循环,并且通过pcntl_waitpid函数来等待所有子进程完成后才继续向下进行
while (pcntl_waitpid(0, $status) != -1) {
//pcntl_wexitstatus返回一个中断的子进程的返回代码,由此可判断是哪一个子进程完成了
$status = pcntl_wexitstatus($status);
echo "Child $status has completed!\n";
} echo "Parent #{$ppid} has completed!\n"; echo "\nSCRIT END AT: ", date('Y-m-d H:i:s', $start), "\n";
echo "TOTAL TIMEEEE: " . (time() - $start)/60;
echo "\n++++++++++++++++++++++++++++++++++++++++++++OK++++++++++++++++++++++++++++++++++++++++++++++++++\n";
?>
CLI下另一种多进程实现方式----PCNTL的更多相关文章
- ASP.NET MVC下的四种验证编程方式[续篇]
在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...
- ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...
- ASP.NET MVC下的四种验证编程方式[续篇]【转】
在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...
- ASP.NET MVC下的四种验证编程方式【转】
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...
- Asp.Net Core下的两种路由配置方式
与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...
- linux 下的两种软件安装方式 —— 源码(编译、安装),编译好的二进制(直接安装)
我们以 GPG(加密工具)为例来说明两种安装方式的区别: 源码(Source code releases,名称中则会含有src等说明信息,tarball:source),先编译再安装 GPU 的源码地 ...
- position relative top失效的问题,温习下常用两种的居中方式
因为body和html,默认高度是auto 所以相对于他们作为父元素设置position:relative的top值需要加上body,html{height:100%;} <!DOCTYPE h ...
- 四种数据持久化方式(下) :SQLite3 和 Core Data
在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...
- android环境下两种md5加密方式
在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...
随机推荐
- poj 1273 最大流入门
明天再拍一遍 #include <iostream> #include <queue> using namespace std; ; const int INF = 0x7FF ...
- 谈敏捷,谈开发 --《Agile Software Development》读后感
谈敏捷,谈开发 --<Agile Software Development>读后感 北航计算机学院 110616班 11061171 毛宇 联系方式:maoyu815930@sina.co ...
- C语言位取反问题
1 具体是先把十进制的数先转换成二进制的原码, 按位取反最后一位加一,然后“按权展开”,得到十进制的结果, 如果第一位是1(指转换成二进制的原码中的第一位),说明故是负数所以要在结果前面加上负号-. ...
- Ubuntu 11.10升级Ruby (1.8.7 --> 1.9.3或者其他任意版本)
使用apt-get install ruby,安装的默认版本为1.8.7.想要使用更高版本,只能采用手工升级的方式. 方式1 使用RVM(推荐方式) 1 安装RVM http://rvm.io/rvm ...
- Train Problem I (HDU 100题纪念)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- Codeforces Round #328 (Div. 2)
这场CF,准备充足,回寝室洗了澡,睡了一觉,可结果... 水 A - PawnChess 第一次忘记判断相等时A先走算A赢,hack掉.后来才知道自己的代码写错了(摔 for (int i=1; ...
- 数据库操作sql【转】
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表 问题:1. ...
- jquery插件 源码
下面是对Jquery几个经常用到的地方进行的增强. 功能是参考百度七巧板JS框架来完成的. 一.页面属性 $.page.getHeight():获取页面高度 $.page.getWidth():获取页 ...
- TYVJ P1069 cowtour 看不懂题意
描述 农民John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,农民John就有多个牧场了. Joh ...
- TYVJ P1086 Elevator Label:dp
背景 广东汕头聿怀初中 Train#2 Problem4 描述 现有N种箱子,每种箱子高度H_i,数量C_i.现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方.试求最大叠放高度. 输入 ...