用于PHP Blob下载的Azure SDK导致内存不足

格什

我正在使用Azure blob存储将大量的pdf和zip文件存储在云中。我正在通过azure sdk for php访问文件,并将文件直接推送给用户(当然,用户不应该看到文件的来源,因此我不会将他重定向到Microsoft url)。我的代码如下所示:

$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($this->azureConfig['connectionString']);

$blob = $blobRestProxy->getBlob($container, $blobName);
$properties = $blobRestProxy->getBlobProperties($container, $blobName);

$size = $properties->getProperties()->getContentLength();
$mime = $properties->getProperties()->getContentType();
$stream = $blob->getContentStream();

header("Pragma:no-cache");
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: $mime");
header("Content-length: $size");

fpassthru($stream);

对于小文件,一点问题都没有,对于大文件,我收到此错误:

Fatal error: Out of memory (allocated 93323264) (tried to allocate 254826985 bytes) in \vendors\azure-sdk-for-php\WindowsAzure\Common\Internal\Utilities.php on line 450

有没有更好的方法可以在用户无法识别的情况下用php向用户提供云存储文件?

我已经找到了这个讨论https://github.com/Azure/azure-sdk-for-php/issues/729,但是curl解决方案只是行不通。

谢谢!

最好的网格

加里·刘-MSFT

据我了解,由于下载了较大的文件,该程序消耗了更多的内存。在这种情况下,我们可以采取以下措施来克服内存耗尽错误:

  1. 设置memory_limit值。

有一个名为PHP env的配置,memory_limit用于限制可以分配的内存。我们可以使用以下代码在php页面中设置memory_limit值:

ini_set("memory_limit","200M");

如果您不想设置文件大小,则可以将memory_limit值设置为“ -1”,就像:

ini_set("memory_limit","-1");

另一种方法是,我们可以在配置文件中将其放大(例如php.ini)。官方指南告诉您如何配置PHP环境。

  1. 夹头下载文件

我们还可以下载大块的Blob,以减少内存开销。

要查看中的SDK源代码BlobRestProxy.php,有一个用于获取Blob的函数public function getBlob($container, $blob, $options = null),我们可以设置其他参数$options来每次获取Blob。这是我的代码段:

$properties = $blobRestProxy->getBlobProperties($container, $blobName);
$size = $properties->getProperties()->getContentLength();
$mime = $properties->getProperties()->getContentType();
$chunk_size = 1024 * 1024;
$index = 0;
//$stream = "";

header("Pragma: public");
header('Content-Disposition: attachment; filename="' . $blobName . '"');
header('Expires: 0');
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Transfer-Encoding: binary");
header("Content-type: $mime");
header("Content-length: $size");
ob_clean();

while ($index < $size) {
       $option = new GetBlobOptions();
       $option->setRangeStart($index);
       $option->setRangeEnd($index + $chunk_size - 1);
       $blob = $blobRestProxy->getBlob($container, $blobName, $option);
       $stream_t = $blob->getContentStream();
       $length = $blob->getProperties()->getContentLength();
       $index += $length;
       flush();
       fpassthru($stream_t);
}

如有任何疑问,请随时让我知道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP内存不足

来自分类Dev

内存不足PHP

来自分类Dev

PHP CLI内存不足

来自分类Dev

使用大字节数组下载大文件会导致“内存不足”

来自分类Dev

使用Java SDK API从Google云端硬盘下载文件时出现内存不足错误

来自分类Dev

文件下载-内存不足(OOM)

来自分类Dev

Azure下载Blob文件流/内存流

来自分类Dev

Azure下载Blob文件流/内存流

来自分类Dev

找出PHP是否内存不足

来自分类Dev

内存不足,无法在PHP中分配

来自分类Dev

PHP文件上传-内存不足

来自分类Dev

Azure功能内存不足异常

来自分类Dev

使用Base64将Android Image上传/下载到JSON中导致内存不足错误

来自分类Dev

PHP内存不足更改内存大小无济于事

来自分类Dev

使用AFNetworking NSOperations连续下载许多文件.....内存不足

来自分类Dev

使用Retrofit 2的内存不足下载文件

来自分类Dev

下载大媒体文件时,请求使内存不足

来自分类Dev

使用AFNetworking NSOperations连续下载大量文件.....内存不足

来自分类Dev

带有curl的下载文件sftp内存不足

来自分类Dev

下载文件时内存不足异常(DevExpress Filemanager)

来自分类Dev

读取Blob字段时出现问题-内存不足

来自分类Dev

从Azure存储Blob下载文件的简单PHP cURL方法

来自分类Dev

截图不足导致内存不足

来自分类Dev

PHP内存不足,但仅在一个系统上

来自分类Dev

Azure功能:内存不足,无法继续执行程序

来自分类Dev

在Azure Webjob中使用PdfSharp的内存不足异常

来自分类Dev

php SDK中前缀的Azure列表Blob

来自分类Dev

StringBuilder追加导致内存不足的原因

来自分类Dev

Seaborn:使用boxplot导致内存不足