【问题标题】:Downloading Large Numbers of Files with Laravel使用 Laravel 下载大量文件
【发布时间】:2018-10-04 09:27:12
【问题描述】:

我有一种情况,我需要从 S3 下载并压缩大量文件(可能超过 2000 个),然后将它们发送给客户端下载。每个文件都不是那么大,但它是服务器要完成的一项大型操作。

我已经设置了这样一种方式,即我在工作环境中处理此任务,并使用带有 S3 的流来下载文件并压缩它们。我仍然发现,当此作业处理时,这会给服务器带来很大压力,有时会导致“内存不足”错误。

谁能推荐一种更好的方法来处理这种情况?如何从 S3 下载大量文件,将它们组合成一个存档,然后高效地将该存档提供给客户?

我注意到 Dropbox 本身不允许您一次下载超过 200 个文件,这是解决此问题的最佳方法吗?分块下载?

【问题讨论】:

  • 只下载文件夹中的文件,然后压缩不行?
  • 有很多文件。完成这项任务似乎占用了大量内存......
  • 你怎么知道要下载的文件名?访问该文件夹,或者您拥有列表来特别调用这些文件?
  • 文件密钥存储在数据库中,所以我知道我需要哪些。从我在 S3 中看到的情况来看,无法压缩整个目录并下载它,所以我必须一个一个地去。
  • Guzzle allows async requests 这可能会优化您实现的吞吐量。 AWS SDK v3 开箱即用,因此您很有可能也可以使用它来执行异步请求。

标签: php laravel amazon-s3 download


【解决方案1】:
 // Laravel: 
 $tempImage = tempnam(sys_get_temp_dir(), $filename);
 copy('https://my-cdn.com/files/image.jpg', $tempImage);
 return response()->download($tempImage, $filename);

逐个下载文件,将它们放在一个目录中,然后下载完成后,使用以下命令压缩文件夹:

// Core php: 
$archive_name = 'path\to\archive\arch1.tar';
$dir_path = 'path\to\dir';

$archive = new PharData($archive_name);
$archive->buildFromDirectory($dir_path); // make path\to\archive\arch1.tar
$archive->compress(Phar::GZ); // make path\to\archive\arch1.tar.gz
unlink($archive_name); // deleting path\to\archive\arch1.tar

压缩代码取自:Compressing a directory of files with PHP

【讨论】:

  • 是的,我正在这样做。好像很占内存。想知道是否有其他方法。
  • 文件大小是多少?它不应该吸内存。我希望你是通过一些后端进程来做的,而不是通过浏览器中的 url
  • 浏览器中的 URL 调度在工作环境中处理的作业。每个文件都很小,但是当您添加很多文件时,存档会超过 1gb 大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多