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

标签 php azure blob storage

我正在将提供大型可下载文件(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/

相关文章:

php - 在向 mysql 输入数据时删除额外的空间

azure - 使用 SSIS 脚本任务连接到本地服务器,并使用自托管 IR 作为 ADF 中 Azure-SSIS IR 的代理

azure - 在azure虚拟机上部署网站并访问互联网

Delphi、TBlobField 和 UTF8

java - 我如何存储和检索数据库中的图像?

Delphi XE2 - 处理 blob 字段

php - 如何在 PHP/MySQL 中将 ","读取为 "<br/>"?

php - Json 到带有希腊字符的 xml

php - 如何检查 MySQL 列以确保它包含值?

azure - VS 2012 使用 MSBuilld 命令发布配置文件和复制文件