PHP有没有类似Nodejs中async/await的异步方案

先说一下需求,EXCEL导入后解析出图片并上传OSS,拿到链接后连同excel其他列返回给前端做预览展示,之后前端再点击保存写入数据库;
同步执行的话传2张图片要等好几秒,之前做过Nodejs开发,很自然就联想到用异步任务去优化,或者开多线程,找了很久没有找到合适的样例,求教;

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
sanders
最佳答案

我讲点自己的思路:

演示的话尽量使用前端读取 excel 实现,服务端不太适合处理这种任务。

如果一定要服务端实现 PHP 很难在进程间共享读取到的内容,尤其是 excel 图片这种占内存较多的数据。集群处理的队列能在该功能在大量使用时提供较好的性能,但对处理单个 excel 文件这种基于本地资源的任务,很难做出优化。所以我的想法是先将,excel 内容合盘读出,按数据粒度拆分成不同的数据保存到本地文件系统,之后在使用多进程并行去处理这些文件(如:Laravel 11 的 Process::start())。

1个月前 评论
讨论数量: 23

guzzlehttp 异步请求

guzzlehttp 并发请求

异步请求/并发请求, 但是没有 js 那样异步请求事继续做其他的事情

1个月前 评论

引入 Swoole 扩展可以实现异步并发上传的功能,类似于 NodeJs 中 async/await 异步玩法。

1个月前 评论
skarner

试试这个包

github.com/spatie/async

use Spatie\Async\Pool;

$pool = Pool::create();

foreach ($things as $thing) {
    $pool->add(function () use ($thing) {
        // Do a thing
    })->then(function ($output) {
        // Handle success
    })->catch(function (Throwable $exception) {
        // Handle exception
    });
}

$pool->wait();
1个月前 评论
晏南风 1个月前
__zhi (楼主) 1个月前

reactphp 可以实现

1个月前 评论

因为传完后要把图片链接返回给前端进行展示,关于这一点,我看有些网站前端显示的其实是本地图片,并不是上传成功后的图片

1个月前 评论
Rache1 1个月前
__zhi (楼主) 1个月前
__zhi (楼主) 1个月前

用队列啊,展示链接预生成可访问链接,还没完成时访问链接就提示下

1个月前 评论
__zhi (楼主) 1个月前

上传可以是普通上传, 然后加个队列,把服务器本地图片放到云上,在将图片地址替换为云上的地址

1个月前 评论
__zhi (楼主) 1个月前
sanders 1个月前

以下包均支持异步,仅供参考。
guzzle
reactphp
amphp

1个月前 评论
sanders

我讲点自己的思路:

演示的话尽量使用前端读取 excel 实现,服务端不太适合处理这种任务。

如果一定要服务端实现 PHP 很难在进程间共享读取到的内容,尤其是 excel 图片这种占内存较多的数据。集群处理的队列能在该功能在大量使用时提供较好的性能,但对处理单个 excel 文件这种基于本地资源的任务,很难做出优化。所以我的想法是先将,excel 内容合盘读出,按数据粒度拆分成不同的数据保存到本地文件系统,之后在使用多进程并行去处理这些文件(如:Laravel 11 的 Process::start())。

1个月前 评论

上传可以用 curl multi

1个月前 评论

头像好看,我瞬间想开了

1个月前 评论

总结一下此帖:
guzzlehttp:需要改动ossClient,ossClient是阿里巴巴封装好的,工作量较大
Swoole:还没尝试,后续有机会会试一下,最近任务比较多;
github.com/spatie/async:实测耗时不减反增,进程切换开销太大了,我这点需求没必要;
reactphp:这个涉及到换框架了,不考虑;
最后解决方案:需求变了,不用传图了,直接存的别的平台的图片链接;

1个月前 评论

我一般都是save 到 local, 不用OSS,万一我客户忘了给服务器钱,图片直接消失!

像我这种独立开发者,每次很容易遇上的都是穷B老板,有钱的集团也不喜欢找我这种单干的团队,怕你生病了,谁来处理之后的事?哈哈哈

没事。。。同时有那么多5个穷B老板维护费可以顶1个集团的收入!

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!