PHP 并发技术详解
2013-11-07 12:30
531 查看
主要是pcntl和popen
高负载处理--“三剑客”:
缓存、缓冲、并发
1.使用PCNTL扩展:
process control
主要使用pcntl_fork函数和pcntl_waitpid函数
注明: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开发者有所帮助,感谢您阅读本文。如果您想要了解更多有关php技术问题欢迎加群探讨:304224365
,验证码:csl,不写验证不予通过。
高负载处理--“三剑客”:
缓存、缓冲、并发
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,不写验证不予通过。
相关文章推荐
- PHP的数据库接口和技术详解
- php5与mysql5 web 开发技术详解-7 php加密技术
- 24-PHP+MySQL分页技术详解 推荐
- PHP内存缓存技术memcached详解
- PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
- php5与mysql5 web 开发技术详解-4 php控制结构和函数
- php5与mysql5 web 开发技术详解-10 php会话管理
- PHP企业级应用缓存技术详解
- 详解PHP操作Memcache缓存技术提高响应速度的方法
- php5与mysql5 web 开发技术详解-9 php开发规范
- PHP企业级应用缓存技术详解
- php5与mysql5 web 开发技术详解-8 php国际化与本地化
- PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
- Go语言并发技术详解
- php_D3_“简易聊天室 ”实现的关键技术 详解
- PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
- PHP+MySQL开发技术详解—学习笔记
- php接口技术实例详解
- 《详解PHP面向对象》系列技术文章整理收藏
- 大型PHP电商网站商品秒杀功能实现思路分析 技术角度称为:高可用 高并发