【问题标题】:Imagick insufficient memory (case 4) on save保存时想象内存不足(案例4)
【发布时间】:2016-11-19 19:09:06
【问题描述】:

我正在尝试使用 Imagick 和 php 保存图像。 当我打电话给saveImage()saveImageFile() 时,我得到了

致命错误:未捕获的异常“ImagickException”和消息“内存不足(案例 4)”

图像大约 1MB 大,脚本可以使用 256MB 内存,我认为应该足够了。磁盘上有足够的可用空间。

可能是什么问题?

代码如下:

<?php
list($type, $img) = explode(';', $img);
list(, $img)      = explode(',', $img);
$data = base64_decode($img);
$image = new Imagick();
$image->readImageBlob($data);
$image->setImageFormat("jpeg");
$image->setInterlaceScheme(Imagick::INTERLACE_PLANE);
$image->writeImageFile(fopen($name.'-original.jpg','w'));
?>

如果我尝试使用file_put_contents() 而不是saveImage(),则会保存一个空文件。可能是服务器配置有问题?

【问题讨论】:

  • 被引用的内存是 RAM 而不是磁盘。这可能发生在共享主机的情况下。如果您有专用服务器,请尝试将此类操作推送到后台作业:)
  • @raina77ow 图像格式为 JPEG。系统是 FreeBSD 8.3-RELEASE-p4 i386。 PHP 是 PHP 5.6.16
  • 你检查过this tip吗?
  • @georoot 这是一个共享主机,但主机说我应该始终有至少 256MB 的可用内存。
  • 转念一想,这个提示可能与您的情况无关。您能否分享更多细节 - 例如显示代码?另外,ini_get('memory_limit') 的结果是什么?

标签: php imagick


【解决方案1】:

问题在于$image-&gt;readImageBlob($data),即使它返回成功,结果图像也是空的。我猜这会在稍后保存期间导致除以零。

我使用的解决方案是先将数据保存到文件中,然后重新加载:

list($type, $img) = explode(';', $img);
list(, $img)      = explode(',', $img);
list(,$type) = explode('/',$type);
$data = base64_decode($img);
file_put_contents($name,$data);
$image = new Imagick($name);

虽然这增加了很多延迟,因为我们必须通过磁盘,但这是我能想到的最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2015-06-14
    • 2011-10-05
    • 2016-06-09
    相关资源
    最近更新 更多