Swoole Process比pcntl稳定的PHP多进程
2018-04-02 本文已影响275人
大胡子商人
模拟场景:
假设处理一个任务需要1s,共有7个任务
1.按照php传统的同步编程方法:
<?php
//记录程序开始执行时间
echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
//定义任务列表
$arr = [
'task 1',
'task 2',
'task 3',
'task 4',
'task 5',
'task 6',
'task 7',
];
//执行任务
foreach($arr as $v){
echo doWorker($v);
}
//任务执行结束
echo "all worker finished".PHP_EOL;
echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
//模拟执行任务方法
function doWorker($worker){
sleep(1);
return $worker.' is finished'.PHP_EOL;
}
测试结果:
image2.swoole多进程:
<?php
//记录程序开始执行时间
echo "start-time : ".date('Ymd H:i:s').PHP_EOL;
//用来存放进程列表的数组
$workers = [];
//定义任务列表
$arr = [
'task 1',
'task 2',
'task 3',
'task 4',
'task 5',
'task 6',
'task 7',
];
//根据任务数量创建对应的子进程
for($i=0;$i<count($arr);$i++){
$process = new swoole_process(function(swoole_process $process) use($arr,$i){
//每个子进程执行任务
$res = doWorker($arr[$i]);
//将处理结果写入管道
$process->write($res);
},true);
//开启进程
$pid = $process->start();
//将进程存到进程列表中
$workers[$pid] = $process;
}
//遍历进程列表
foreach ($workers as $worker){
//从管道中取出每个进程的处理结果
$res = $worker->read();
//关闭子进程
$worker->wait(false);
echo $res;
}
echo "all worker finished".PHP_EOL;
echo "end-time : ".date('Ymd H:i:s').PHP_EOL;
function doWorker($worker){
sleep(1);
return $worker.' is finished'.PHP_EOL;
}
测试结果:
image结论:swoole多进程处理方式是为对应任务创建多个子进程并行处理,所以处理时间上个单个任务相差无几.具体使用方法要看实际应用场景而定,这里只做示例.