6

像我之前的许多人一样,我正在编写一个 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 图像上以 <1 秒的速度返回,在“适当小的”图像上显着延长(表示不处理大图像)。
  • 为函数调用添加前缀@以抑制错误无效。这与脚本没有抛出错误的事实非常吻合,它只是默默地终止了这个函数调用。

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

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

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

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

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

4

2 回答 2

2

请在 php 网站上查看有关内存使用情况的说明

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

可以从这个公式计算:

字节数 = 宽度 * 高度 * 每个像素的字节数 * 开销软糖因子"*

于 2009-03-21T05:41:05.407 回答
1

我猜 1&1 不允许您更改脚本memory_limitmax_execution_time,因此它可能内存不足。你试过跑步phpinfo()看看有什么限制吗?

于 2009-03-21T05:16:47.523 回答