在AWS ec2(w/ apache)上运行的PHP网站,无法通过AWS SDK S3下载超过64 MB的内容

pu3pd22g  于 2022-11-16  发布在  Apache
关注(0)|答案(1)|浏览(112)

我已经在网上搜索了很多,找到了几个可能的解决方案,但是没有一个成功。有人说是因为php.ini的设置,有人说是因为我使用的SDK的方法。我有点困在这里了。我已经彻底测试过了,用我现在的代码,我可以从我的S3 bucket下载一个文件,没有问题或损坏。但是它总是被限制在64 MB。有什么方法可以提高这个限制吗?或者增加下载量?
当我试图下载一个超过64兆字节的文件时,页面无法到达。有时它实际上可能会下载文件(虽然它说无法到达),但只有正好64兆字节。

try {
    $result = $s3->getObject([
        'Bucket' => $bucket,
        'Key'    => $keyname
    ]);

    set_time_limit(0); 

    header('Content-Description: File Transfer');
    header("Content-Type: {$result['ContentType']}; charset=utf-8");
    header("Content-Disposition: attachment; filename=".$filename);

    echo $result['Body'];

    } catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

我已经将memory_limit设置为无限制(0)。我也尝试将内存限制设置为大约64兆字节,但仍然没有成功。
我试着修改post_max_size等等,但是仍然没有任何结果。我不确定这个问题是否依赖于我的apache/php设置,我正在运行的EC2,或者S3 SDK的限制。
我正在运行的EC2示例是一个t2.xlarge,运行:Ubuntu 20.04嵌入式LinuxApacheMySQL/数据库PHP
我发现的一些类似的问题(第一个我已经尝试没有运气):
Download large files from s3 via php〈--此链接有解决方案
Max execution time out error when tried to download large object(2gb) from s3 bucket to window server using php
下面的链接我不是很明白,显然解决方案应该是增加下载量(根据在线托马斯的说法),但我不确定这将如何工作。我将如何合并数据,以及我将如何继续从我停止的地方下载?我缺少一个如何工作的解决方案的例子。该帖子的OP问了同样的问题。

3df52oht

3df52oht1#

从OP的第一个链接的预先签署的请求解决方案,确实解决了我的问题。然而,这是一个不同的“下载方式”,在我的代码之前,我们使用SDK通过SDK下载,现在我们使用SDK来创建一个基本的下载链接。64兆字节的问题仍然存在。我可以使用这个,但如果有人有一个如何通过SDK下载超过64兆字节的解决方案,请告诉我!
我的解决方案:

$cmd = $s3->getCommand('GetObject', [
    'Bucket' => $bucket,
    'Key' => $keyname,
    'ResponseContentDisposition' => 'attachment; filename="'.$filename.'"'
]);

$request = $s3->createPresignedRequest($cmd, '+15 min');
$presignedUrl = (string)$request->getUri();

然后基本上只要在HTML、JS等中的任何地方打开该URL,它就会开始下载文件。

相关问题