laravel中多线程实践

发布时间:2020-11-07 21:56:05 阅读:2001次

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

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

我们怎样通过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模式下才能使用,并且需要pcntlposix的扩展支持,可以使用php -m 查看是否开启扩展

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

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:laravel中多线程实践 出自老鄢博客 | 欢迎分享