【问题标题】:imagecreatefromjpeg is silently terminating scriptsimagecreatefromjpeg 正在静默终止脚本
【发布时间】:2010-10-14 16:52:15
【问题描述】:

像我之前的许多人一样,我正在编写一个 PHP 脚本来做一些图像缩略图。该脚本已获得 WOMM(在我的机器上工作)认证,但是当我将其移动到我的主机(1&1 Basic)时,出现了一个问题:无法处理超过特定文件大小的图像。我已将所有操作移至文件系统,以确保这不是潜在的POST 问题。以下是相关代码:


function cropAndResizeImage( $imageLocation )
{
  //
  // Just to be certain
  //
  ini_set('display_errors','on');
  error_reporting(E_ALL);
  ini_set('memory_limit','128M'); 
  ini_set('max_execution_time','300');  

  $image_info   = getimagesize($imageLocation);
  $image_width  = $image_info[0];
  $image_height = $image_info[1];
  $image_type   = $image_info[2];

  switch ( $image_type )
  {
    // snip...
    case IMAGETYPE_JPEG:
      $image = imagecreatefromjpeg($imageLocation);
      break;

    default:
      break;
  }

  // snip...
}

使用我的println 调试的神秘力量,我已经能够确定imagecreatefromjpeg 没有返回;事实上,脚本到达它时会完全停止。一些事实:

  • 这与文件大小相关。低于 1MB 的图像看起来还不错(经过抽查),但 3MB 左右的图像就不行了。不过,不知道确切的截止值是多少。
  • 这不是因为服务器超时; wget 在 3MB 图像上以
  • 在函数调用前加上@ 以抑制错误无效。这与脚本没有抛出错误这一事实非常吻合,它只是默默地终止了这个函数调用。

如果我不得不猜测,可能有一些我不知道(或无法访问)的 GD 参数限制 1&1 的服务器上的输入文件大小 - 配置变量猜测是由于它立即 barfs ,并且不会(启发式地)对图像进行任何实际加载或计算。

有什么建议吗?感谢您的帮助。

更新(由@Darryl's cmets 提供): 调用phpinfo 表明PHP 正在正确更新max_execution_timememory_limit 变量。这并不一定意味着这些资源正在被分配,只是它们似乎按预期运行。

更新 2: 根据 Google 的一些参考资料,我尝试优化 JPEG(质量从 3MB 降低到 200KB)但没有成功,因此这不是图像文件大小问题。然后我尝试减少原始 3888x2592 图像的像素数,第一个成功的尺寸是 1400x2592(1401x 和 1402x 都导致半解析和错误指示“格式错误的 JPEG”,除非整个图像没有多大意义没有被加载)。通过进一步减小到 1300x2592,我可以实例化我实际正在寻找的 400x300 缩略图;在 1400x2592 时,我用来处理该任务的 imagecreatetruecolor 调用以与 imagecreatefromjpeg 相同的方式静默失败。

至于为什么会这样,我有点不确定。 1400 * 2592 == 3.5MB 没有什么特别的意义,但我不得不想象这是 GD + PHP 将处理的像素数量的限制。

【问题讨论】:

    标签: php gd thumbnails


    【解决方案1】:

    有关 php 网站上的内存使用情况,请参阅this note

    *"使用 imagecreatefromjpeg() 加载图像所需的内存是图像尺寸和图像位深度的函数,乘以开销。

    可以用这个公式计算:

    Num bytes = Width * Height * Bytes per pixel * Overhead fudge factor"*

    【讨论】:

    • 嗨,JC——当我将内存分配降低到 1M 并使用较小的图像时,我收到此错误:“致命错误:允许的内存大小为 1048576 字节用尽(尝试分配 4096 字节) /homepages/17/d203907073/htdocs/dis/dev/inc/image.functions.php 第 98 行"(...继续...)
    • (...continued...) 因为在这种情况下服务器正确地抛出“内存不足”错误,我猜这是一个不同的原因,因为在我的情况下没有错误被抛出.无论如何,3MB 的图像大约是 3Kx3K 像素,在 alpha 和 2x fudge 因子下转换为大约 70MB。
    【解决方案2】:

    我猜 1&1 不允许您更改脚本 memory_limitmax_execution_time,所以它可能内存不足。您是否尝试过运行 phpinfo() 来查看限制是什么?

    【讨论】:

    • Hey Darryl——我真的很惊讶地发现这一点,但 1&1 出现 允许设置这些参数。至少,当我设置它们并运行 phpinfo() 时,一切都会按预期显示。他们有没有可能有二级执法系统?
    猜你喜欢
    • 2016-03-09
    • 2010-12-11
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2011-01-02
    • 2020-07-16
    • 2013-11-17
    • 2019-05-10
    相关资源
    最近更新 更多