PHP Laravel将文件上传到AWS S3 Asyncronous

时间:2018-01-24 05:11:07

标签: php laravel amazon-s3

我正在使用AWS S3实现上传文件。我要上传的文件平均为500 Mb。上传(使用文件系统AWS S3)的过程是同步的。因此,当一个用户上传大文件时,其他人无法访问该网站,直到用户完成上传进度。如何使它异步?

基本上,我有两个问题:

  1. 以块的形式上传大文件,以便其他人可以使用该网站
  2. 异步上传。
  3. 我用来处理上传的命令是:

    Storage::put('preview_image/'.$file_name, $file_preview_image_1, 'public');
    

5 个答案:

答案 0 :(得分:0)

为什么不使用异步分段上传,建议大于100MB的文件使用? 代码看起来像这样:

$source = '/path/to/large/file.zip';
$uploader = new MultipartUploader($s3Client, $source, [
    'bucket' => 'your-bucket',
    'key'    => 'my-file.zip',
]);

$promise = $uploader->promise();

您可以在此处查看文档:{​​{3}}

答案 1 :(得分:0)

我不明白为什么其他用户无法访问该网站,因为现代服务器能够很好地处理多个请求,您可能需要考虑升级服务器。

但是要在项目中使用异步行为,您可以查看laravel作业和队列,这里是文档https://dzone.com/articles/integrate-h2-database-in-your-spring-boot-applicat,但您必须考虑适当地更改队列驱动程序,默认情况下laravel队列驱动程序为{{1这只是同步的,一旦你的队列设置它可以是redis队列或amazon sqs或任何东西,你可以将文件uploadng作业推送到队列,你可以让用户从等待文件的麻烦中解脱出来要上传,有link等自定义程序包用于监控您的队列。如果失败,你甚至可以重新开始工作。

答案 2 :(得分:0)

处理花费过多时间(超过5秒)完成工作的经验法则是在后台处理它们。

请参阅:https://laravel.com/docs/5.5/queues

  

因此,当一个用户上传大文件时,其他人无法访问该网站,直到用户完成上传进度

然而,您的上传带宽正在被上传 OR 完全消耗,运行上传过程的php脚本正在消耗太多内存,因此会阻止其他PHP线程产生

答案 3 :(得分:0)

如果您尝试将文件从用户磁盘上传到远程位置,则无法执行您想要的操作(即将其排队等待以后完成)。

用户需要在表单的$POST请求中完成文件上传 - 您无法queue稍后再进行此操作。排队是为了延迟服务器端处理任务并在以后完成 - 但上传需要用户留在页面上以send将数据发送到您的服务器。

要进一步扩展 - 您可以做的最佳选择是使用像dropzonejs之类的软件包进行javascript异步上传。这样,用户可以同时上传多个文件,并可以更新视觉进度条。

答案 4 :(得分:0)

已解决

经过几天的打击并继续战斗寻找好的答案。最后,我解释了为什么我的项目运行单线程,因为我运行php artisan serve。我在https://github.com/laravel/framework/issues/22944上报告了问题。