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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
sanders
最佳答案

我讲点自己的思路:

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

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

1年前 评论
讨论数量: 25

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年前
guanguans 9个月前

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年前 评论

我也做过这个场景,是数据导出,下载远程资源。
第一版用 php 下载远程图片,同步等待非常久;第二版用 node,并发请求下载,比 php 版本快。
phpnode 之间通过 http 形式访问。
我的可能和楼主的不太一样,楼主还需要回显数据的话,异步可能没办法及时回显。

9个月前 评论