看看PHP 多进程处理任务

看看PHP 多进程处理任务,第1张

概述看看PHP 多进程处理任务

pcntl 模块(非 Unix 类系统不支持此模块)

一个 PHP 多进程简单例子大概是这个样子:

// 5 个子进程处理任务for ($i = 0; $i < 5; $i++) {    $pID = pcntl_fork();    if ($pID == -1) {        dIE("Could not fork");    } elseif ($pID) {        echo "I'm the Parent $i\n";    } else { // 子进程处理        echo "I'm the Child $i\n";        // 业务处理        exit($i); // 一定要注意退出子进程,否则 pcntl_fork() 会被子进程再 fork,带来处理上的影响。    }}// 等待子进程执行结束while (pcntl_waitpID(0, $status) != -1) {    $status = pcntl_wexitstatus($status);    echo "Child $status completed\n";}复制代码

当然实际应用中我们不能够这样输出代码,不够健壮,也不够优雅,我所以找了个基于 pcntl 封装的扩展包来使用。

spatIE/async - 基于 pcntl 封装的扩展包

以下是我使用 spatIE/async 来优化一个多进程请求的例子

原代码(耗时 20s 左右)- github.com/guanguans/m…

/** * @param string $keyword * * @return array */public function searchAll(string $keyword): array{    $songall = [];    foreach ($this->platforms as $platform) {        $songall = array_merge($songall, $this->search($platform, $keyword));    }    return $songall;}/** * @param string $platform * @param string $keyword * * @return mixed */public function search(string $platform, string $keyword){    $meting = $this->getMeting($platform);    $songs = Json_decode($meting->format()->search($keyword), true);    foreach ($songs as $key => &$song) {        $detail = Json_decode($meting->format()->url($song['url_ID']), true);        if (empty($detail['url'])) {            unset($songs[$key]);        }        $song = array_merge($song, $detail);    }    unset($song);    return $songs;}复制代码

改进后(耗时 4s 左右)- github.com/guanguans/m…

/** * @param string $keyword * * @return array */public function searchAll(string $keyword): array{    $songall = [];    $pool = Pool::create();    foreach ($this->platforms as $platform) {        $pool->add(function () use ($platform, $keyword) {            return $this->search($platform, $keyword);        }, $this->getSerializedOutput())->then(function ($output) use (&$songall) {            $songall = array_merge($songall, $output);        })->catch(function (\Throwable $exception) {            exit($exception->getMessage());        });    }    $pool->wait();    return $songall;}/** * @return mixed */public function search(string $platform, string $keyword){    $meting = $this->getMeting($platform);    $songs = Json_decode($meting->format()->search($keyword), true);    $pool = Pool::create();    foreach ($songs as $key => &$song) {        $pool->add(function () use ($meting, $song) {            return Json_decode($meting->format()->url($song['url_ID']), true);        })->then(function ($output) use (&$songs, &$song, $key) {            $song = array_merge($song, $output);            if (empty($song['url'])) {                unset($songs[$key]);            }        })->catch(function (\Throwable $exception) {            exit($exception->getMessage());        });    }    unset($song);    $pool->wait();    return $songs;}复制代码

想了解更多编程学习,敬请关注php培训栏目!

总结

以上是内存溢出为你收集整理的看看PHP 多进程处理任务全部内容,希望文章能够帮你解决看看PHP 多进程处理任务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1159955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存