为了提高程序的执行效率,我们可能需要多线程的执行程序
我们当然可以写一个脚本,然后将要执行的命令行写在里面,然后用 `&` 后台执行,这样比较麻烦
我们怎样通过`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 查看是否开启扩展
执行后我们发现时间的输出是非顺序的,就知道已经成功实现多线程