PHP中怎么利用多进程处理任务
发表于:2025-02-10 作者:千家信息网编辑
千家信息网最后更新 2025年02月10日,PHP中怎么利用多进程处理任务,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PHP 多进程处理任务pcntl 模块(非 Unix 类
千家信息网最后更新 2025年02月10日PHP中怎么利用多进程处理任务
spatie/async - 基于
PHP中怎么利用多进程处理任务,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
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 左右)- https://github.com/guanguans/...:
/** * @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 左右)- https://github.com/guanguans/...:
/** * @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中怎么利用多进程处理任务问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
进程
处理
任务
问题
不够
代码
例子
更多
模块
封装
帮助
解答
健壮
易行
优雅
简单易行
业务
个子
内容
实际
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京软件开发介绍
数据库表最大行数
电子商务网络安全课件ppt
金铲铲之战服务器不同能一起玩么
回收服务器cpu
荣耀全明星去哪个服务器
网络技术基础体温下降
北京华软动力网络技术
内存数据库 sql
嘉兴智能互联网科技有限公司
onenote提示临时服务器
plsql数据库过期了
怎么编辑软件开发平台
分布式数据库大小
洛阳中等计算机网络技术专业
还原iphone无法联系服务器
数据库 exist
战地五服务器名字星号
数据库的循环语言运用例子
软件开发外包后的出路
scum服务器怎么刷不出来
上海吉七互联网科技公司
创业基础计划书范文软件开发
linux服务器开发
蛋白乙酰化数据库
为什么流量上网没有服务器
河南信息化软件开发价格服务标准
石景山区网络软件开发创新服务
白云区数据网络技术开发商家
软件开发能否转型产品经理