魏长东

weichangdong

php多进程神功

用php的pcntl_fork 实现多进程感觉挺麻烦的。

最近发现swoole除了tcp socket udp之类的,还可以实现多进程,太帅了。

另外workerman,实现的网页推送效果也非常的赞!!!但是他的多进程咋用,暂时还么研究。

下面是swoole的多进程测试。

思路是:给redis的list push 100w数据,然后常规的pop,耗时一般是32妙,然后使用swoole,如果进程数量是1,也是32妙,但是进程数量改成2的话,时间就是16秒了。

造数据

<?php
$redis = new redis();
$redis->connect("127.0.0.1");
for($i=0;$i<1000000;$i++){
	$redis->lpush("test_swoole",$i);
}
echo $redis->llen("test_swoole");

常规代码

<?php
$t1 =  time();
$redis = new redis();
$redis->connect("127.0.0.1");
//for($i=0;$i<1000000;$i++){
	while(true){
		$re = $redis->rpop("test_swoole");
		if($re === false){
			break;
		}

	}
//}
$t2 = time();
echo  $t2-$t1;

神功大法

<?php
$t1 = time();
$workers = [];
$worker_num = 2;//创建的进程数

for($i=0;$i<$worker_num ; $i++){
	$process = new swoole_process('process');
	$pid = $process->start();
	$workers[$pid] = $process;
}


function process(swoole_process $process){// 第一个处理
	$redis = new redis();
	$redis->connect("127.0.0.1");
	while(true){
		$re = $redis->rpop("test_swoole");
		if($re === false){
			break;
		}

	}
	$process->exit(0);
}
for($i = 0; $i < $worker_num; $i++)
{
	$ret = swoole_process::wait();
	$pid = $ret['pid'];
	unset($workers[$pid]);
	//echo "Worker Exit, PID=".$pid.PHP_EOL;
}
$t2 = time();
echo  $t2-$t1;