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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
sanders
最佳答案

我讲点自己的思路:

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

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

8个月前 评论
讨论数量: 25

guzzlehttp 异步请求

guzzlehttp 并发请求

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

8个月前 评论

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

8个月前 评论
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();
8个月前 评论
晏南风 8个月前
__zhi (楼主) 8个月前
guanguans 5个月前

reactphp 可以实现

8个月前 评论

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

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

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

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

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

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

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

8个月前 评论
sanders

我讲点自己的思路:

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

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

8个月前 评论

上传可以用 curl multi

8个月前 评论

头像好看,我瞬间想开了

8个月前 评论

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

8个月前 评论

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

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

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

7个月前 评论

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

5个月前 评论

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