我正在使用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解决方案只是行不通。
谢谢!
最好的网格
据我了解,由于下载了较大的文件,该程序消耗了更多的内存。在这种情况下,我们可以采取以下措施来克服内存耗尽错误:
有一个名为PHP env的配置,memory_limit
用于限制可以分配的内存。我们可以使用以下代码在php页面中设置memory_limit值:
ini_set("memory_limit","200M");
如果您不想设置文件大小,则可以将memory_limit值设置为“ -1”,就像:
ini_set("memory_limit","-1");
另一种方法是,我们可以在配置文件中将其放大(例如php.ini)。该官方指南告诉您如何配置PHP环境。
我们还可以下载大块的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] 删除。
我来说两句