PHP并行编程探索之一(多进程)

时间:2022-06-22 05:26:55

      说实话,我一直在想PHP并行编程是个什么样子的,网上查资料写的不多而且杂,决定根据大多数的资料总结一下。PHP 多进程我认为是PHP原生编程里最接近并发编程的,同时开始执行多个任务。

多进程:多个进程(资源分配的最小单位)同时执行多个任务

PHP并行编程探索之一(多进程)


如上图所示,开辟了3个子进程,分别执行了3个不同的任务,同时开始执行这些互无关联的进程。有点异步的味道。

异步:在一段程序执行的时候,不需要等待结果返回,直接执行下一段程序。

PHP多进程看看是很nb的,可以把那些耗时的 但又必须执行的查询分成多个子进程查,

但是,PHP多进程不支持php-fpm和cgi模式,只能通过php-cli 模式,所以对于web页面的请求,多进程的梦想破灭。

适用场景:

    定时任务执行,且互斥耗时的任务(数据的批量插入,批量更新,日志的批量操作)

下面举个简单的栗子:


class Concurrency
{
/**
* @todo: 获取当前时间 毫秒级
*/
public function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

public function run()
{
$start = $this->microtime_float();
$len = 2;
$i=0;
while($i<$len){
$pids[$i] = pcntl_fork(); //创建子进程
if($pids[$i] == 0){
$pid = posix_getpid();//获取进程id
$this->task($i); //子进程执行代码
exit(0);
}
$i++;
}
//等待进程关闭
for($i=0;$i<$len;$i++){
pcntl_waitpid($pids[$i],$status,WUNTRACED);
if(pcntl_wifexited($status)){
//进程完成退出
}
}
$end = $this->microtime_float();
echo "\n执行时间",$end-$start;
}

public function task($task_id)
{
if($task_id == 0){
sleep(2); //模拟任务执行时间 2s
echo '2222'."\n";
}else{
sleep(3); //模拟任务执行时间 3s
echo '3333'."\n";
}
}
}

$con = new Concurrency();
$con->run();


打印结果:

2222
3333


执行时间3.0103249549866