laravel中多线程实践

为了提高程序的执行效率,我们可能需要多线程的执行程序

我们当然可以写一个脚本,然后将要执行的命令行写在里面,然后用 `&` 后台执行,这样比较麻烦

我们怎样通过`php代码`来实现

首先创建一个`command`

`php artisan make:command test`

代码如下

```
public function handle()
{
$processIds = [];
$dirs = [1,2,3,4,5,6,7,8,9,10];
$count = 10;
//fork 10个子进程
$workers = 10;
$block = (int)ceil($count / $workers);

for ($i = 0; $i < $workers; $i++) { $left = $block * $i; $deal = array_slice($dirs, $left, $block); if ($left < $count) { $processIds[$i] = pcntl_fork(); switch ($processIds[$i]) { case -1 : echo "fork failed : {$i} \r\n"; exit; case 0 : // 子进程处理word读取和图片上传 echo $i."\r\n"; $this->doWork($deal);
exit;
default :
break;
}
} else {
break;
}
}
//子进程完成之后要退出
while (count($processIds) > 0) {
$mypid = pcntl_waitpid(-1, $status, WNOHANG);
foreach ($processIds as $key => $pid) {
if ($mypid == $pid || $mypid == -1) {
unset($processIds[$key]);
}
}
}
}
public function doWork(){
sleep(1);
echo date("Y-m-d H:i:s")."\r\n";
\Log::info('time->'.time());
}
```

`PHP多线程`必须在`php cli`模式下才能使用,并且需要`pcntl`和`posix`的扩展支持,可以使用php -m 查看是否开启扩展

执行后我们发现时间的输出是非顺序的,就知道已经成功实现多线程

    A+
发布日期:2020年11月07日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: