我正在将提供大型可下载文件(4GB 及以上)的网站迁移到 Azure。我已成功创建与 Azure 存储帐户的连接,以便可以检索文件。然而,下载 a) 需要很长时间才能开始,b) 会消耗大量内存,因为我在实际将可下载数据发送到客户端之前将整个文件读入内存。 有没有办法从存储帐户中分块读取文件以避免延迟和内存消耗? 当前的代码如下所示:
$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());
最佳答案
出于多种原因,我建议直接从存储中提供下载。大多数情况下,因为 I/O 性能影响很大,而且流量负载也很重。
我建议使用以下解决方案,而不是使用 PHP - 取决于您的托管环境允许您做什么。
- 直接提供文件的 URL(如果无法选择公共(public) URL,则使用 shared access signatures)
- 如果您不想将用户重定向到 azure 链接,请使用类似
azcopy
的内容将文件下载到您的服务器。 ,将其重命名为 some<hash>.<ext>
并向用户提供直接 URL。 - 如果您确实需要/想要使用 PHP,您可以了解如何拆分文件并将其流式传输给用户:How to upload data by chunks to Azure Blob Storage using PHP
关于php - 从 Azure Blob 存储下载 PHP 中的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75917066/