栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

看看PHP 多进程处理任务

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力


看看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 $in";
    } else { // 子进程处理
 echo "I'm the Child $in"; // 业务处理
 exit($i); // 一定要注意退出子进程,否则 pcntl_fork() 会被子进程再 fork,带来处理上的影响。
    }
}// 等待子进程执行结束while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);    echo "Child $status completedn";
}复制代码

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

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

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

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


原代码

public function searchAll(string $keyword): array{
    $songAll = [];    foreach ($this->platforms as $platform) {
 $songAll = array_merge($songAll, $this->search($platform, $keyword));
    }    return $songAll;
}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…


改进后

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;
}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 多进程处理任务的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/262668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号