php多进程操作的三个实例

发布时间:2019-07-14编辑:脚本学堂
本文介绍下,php编程中多进程操作的三个例子,供大家学习参考。

1,php多进程并行操作实例
 

复制代码 代码示例:

<?php
//多进程并行操作
/**
* 入口函数
* 将此文件保存为 ProcessOpera.php
* 在terminal中运行 /usr/local/php/bin/php ProcessOpera.php &
* 查看进程 ps aux|grep php
* edit www.jb200.com
*/
ProcessOpera("runCode", array(), 8);

/**
* run Code
*/
function runCode($opt = array()) {
//需要在守护进程中运行的代码
}

/**
* $func为子进程执行具体事物的函数名称
* $opt为$func的参数 数组形式
* $pNum 为fork的子进程数量
*/
function ProcessOpera($func, $opts = array(), $pNum = 1) {
while(true) {
$pid = pcntl_fork();
if($pid == -1) {
exit("pid fork error");
}
if($pid) {
static $execute = 0;
$execute++;
if($execute >= $pNum) {
pcntl_wait($status);
$execute--;
}
} else {
while(true) {
//somecode
$func($opts);
sleep(1);
}
exit(0);
}
}
}
?>

2,linux下PHP多进程的方法分享

PHP多进程:使用PHP的Process Control Functions(PCNTL/线程控制函数)
函数参考:http://www.jb200.com/shouce/php5/book.pcntl.html
只能用在Unix Like OS,Windows不可用。
编译php时,要加上–enable-pcntl,且推荐仅仅在CLI模式运行,不要在WEB服务器环境运行。

一个PHP多进程的简单例子:
 

复制代码 代码示例:

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待进程结束
$intNum = 10; /// 进程总数
$pids = array(); /// 进程PID数组

echo ("Startn");

for($i = 0; $i < $intNum; $i++) {

$pids[$i] = pcntl_fork();/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息

if(!$pids[$i]) {
// 子进程进程代码段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子进程进程代码段_End
}

}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3,PHP多进程并行执行脚本

php的进程不支持多线程,有些场景为了方便以及提高性能,可以用php实现多进程。
例如:
 

复制代码 代码示例:

#!/usr/bin/env php
<?php
$cmds=array(
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','mobile',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php','click',2),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',1),
array('/apps/bin/launcher.php','charge/promotion_props_stat.php',2)
);

foreach($cmds as $cmd){
$pid=pcntl_fork();
if($pid==-1){ //进程创建失败
die('fork child process failure!');
}
else if($pid){ //父进程处理逻辑
pcntl_wait($status,WNOHANG);
}
else{ //子进程处理逻辑
pcntl_exec('/usr/local/bin/php',$cmd);
}
}
?>

有关php多进程的例子,就介绍这三个了,希望对大家有所帮助。