您的位置:首页 > 编程语言 > PHP开发

PHP 并发技术详解

2013-11-07 12:30 531 查看
主要是pcntl和popen

高负载处理--“三剑客”:

缓存、缓冲、并发

1.使用PCNTL扩展:

process control

主要使用pcntl_fork函数和pcntl_waitpid函数

<?php
function performSomeFunction($n, &$ret){
$pid = getmypid();
echo "this is in {$pid}.{$n}\n";
usleep(500000);
$ret[$pid] = array($pid);
exit(0);
}
$i = 0;
$starttime = microtime(TRUE);
$pid_arr = array();
$ret_arr = array();
$num = intval($argv[1]);
echo $num."\n";
while ($i < $num)
{
$pid = pcntl_fork();
if ($pid == -1)
{
die('could not fork');
}
else
{
if ($pid) // parent
{
$pid_arr[$i] = $pid;
}
else // child
{
performSomeFunction($i+1, $ret_arr);
}
}
$i++;
}

while(count($pid_arr) > 0)
{
$myId = pcntl_waitpid(-1, $status, WNOHANG);
foreach ($pid_arr as $key => $pid)
{
if ($myId == $pid)
unset($pid_arr[$key]);
}
usleep(100);
}

$elapsed = microtime(TRUE) - $starttime;
print "\n==> total elapsed: " . sprintf("%f secs.\n", $elapsed);
?>


注明:pcntl_fork(手册介绍:http://php.net/manual/en/function.pcntl-fork.php)起进程起来并发处理,然后底层做了测试,效果也还不错,但是当通过apache调用的时候却无法运行。然后看到了pcntl_fork手册有下面一句:

It is not possible to use the function 'pcntl_fork' when PHP is used as Apache module. You can only use pcntl_fork in CGI mode or from command-line.

2.使用popen

popen — 打开进程文件指针

<?php
$num = intval($argv[1]);
$i = 0;
$retArr = array();
$generateNumberArr = array();
while ($i++ < $num) {
$generateNumberArr[$i] = popen("/home/users/gino/apps/php5/bin/php /home/users/gino/test/pcntl/one.php " .$i, 'r');
}

foreach ($generateNumberArr as $generateNumberArr_k =>$generateNumberArr_v) {
$str = '';
while (! feof($generateNumberArr_v)) {
$str .= fgets($generateNumberArr_v, 4096);
}
$retArr[] = $str;
pclose($generateNumberArr_v);

}
var_dump($retArr);
?>


希望本文对广大php开发者有所帮助,感谢您阅读本文。如果您想要了解更多有关php技术问题欢迎加群探讨:304224365
,验证码:csl,不写验证不予通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: