从Azure Blob存储下载PHP中的大文件

ecr0jaav  于 2023-04-04  发布在  PHP
关注(0)|答案(3)|浏览(158)

我在迁移的过程中提供大型下载文件的网站(4GB及以上)到Azure。我已经成功创建了到Azure存储帐户的连接,因此我可以检索文件。但是下载a)需要很长时间才能启动,b)消耗内存负载,因为我在实际将可下载数据发送到客户端之前将整个文件读入内存。有没有一种方法可以从Storage帐户分块读取文件,以避免延迟和内存消耗?当前代码如下所示:

$getBlobResult = $blobClient->getBlob($containerName,$FileName);
$blobProperties=($getBlobResult->getProperties());
$FileSize=$blobProperties->getContentLength();
// Send headers 
header ("Content-type: application/octet-stream");
header ("Content-Length: $FileSize");
header ("Content-Disposition: attachment; filename=\"$FileName\"");
// Send content of file
echo stream_get_contents($getBlobResult->getContentStream());
ljsrvy3e

ljsrvy3e1#

出于许多原因,我建议直接从存储中下载,主要是因为你有很大的I/O性能影响,而且你的流量也很大。
除了使用PHP,我建议使用以下解决方案-这取决于您的托管环境允许您做什么。

  • 直接提供文件的URL(如果不选择公共URL,则使用shared access signatures
  • 如果你不想把用户重定向到一个azure链接,可以用类似azcopy的东西把文件下载到你的服务器上,把它重命名为一些<hash>.<ext>,然后把直接的URL提供给用户。
  • 如果你真的需要/想使用PHP,你可以学习如何拆分文件并将其传输给用户:How to upload data by chunks to Azure Blob Storage using PHP
gmol1639

gmol16392#

是否有方法从存储帐户中分块读取文件,以避免延迟和内存消耗?
你当然可以这样做。当使用getBlob方法下载blob时,你需要在options参数中指定你想要下载的字节范围,该参数的类型为GetBlobOptions
如果我没有弄错的话,你需要定义start-end的范围(例如0-1023下载1KB)

vlju58qv

vlju58qv3#

正如@CodeBrauer建议的那样,通过签名的URL将文件提供给用户是最可取的解决方案,因为您根本不必通过代码/基础设施来传输数据。
如果这与您的要求不一致,那么您可以尝试替换:

echo stream_get_contents($getBlobResult->getContentStream());

其中:

fpassthru($getBlobResult->getContentStream());

它应该直接转储流而不需要任何缓冲区。
https://www.php.net/manual/en/function.fpassthru

相关问题