【问题标题】:PHP GD fails silentlyPHP GD 静默失败
【发布时间】:2012-03-24 11:59:30
【问题描述】:

我一直在研究加载 PNG 文件的图像处理功能。虽然它在远程服务器(FreeBSD,PHP 5.3.6)上的本地服务器(Windows,PHP 5.3.6)上运行良好,但 PHP 在使用 imagecreatefrompng 时返回“500 内部服务器错误”。通常,我会查阅 /var/log/php.log 中的日志 - 但是当我尝试加载页面时,不会向日志中添加任何内容。如果我注释掉包含 imagecreatefrompng 的行,脚本会加载 - 尽管由于缺少图像资源而导致许多错误输出到日志中。

我已经尝试添加:

ini_set('display_errors', 1);
error_reporting(E_ALL);

对代码来说,没有区别。

phpinfo的输出显示GD已加载,gd_info的输出为:

array(12) {
  ["GD Version"]=>
  string(27) "bundled (2.0.34 compatible)"
  ["FreeType Support"]=>
  bool(true)
  ["FreeType Linkage"]=>
  string(13) "with freetype"
  ["T1Lib Support"]=>
  bool(true)
  ["GIF Read Support"]=>
  bool(true)
  ["GIF Create Support"]=>
  bool(true)
  ["JPEG Support"]=>
  bool(true)
  ["PNG Support"]=>
  bool(true)
  ["WBMP Support"]=>
  bool(true)
  ["XPM Support"]=>
  bool(true)
  ["XBM Support"]=>
  bool(true)
  ["JIS-mapped Japanese Font Support"]=>
  bool(false)
}

在这一点上,我完全迷失了。没有核对我的 php 安装并重试,我不知道该怎么做。我计划在更新端口后升级到 5.4,但考虑到我无法确定问题所在 - 我不知道这是否能解决问题。

这是相关代码的 sn-p:

/* load image */
$imgname = '/images/'.$doctype.'_'.side($_GET['side']).".png";
$image_path = trim(shell_exec('pwd')).$imgname;

if(!file_exists($image_path)){
  trigger_error('Image file not found!');
  exit;
}
$im = imagecreatefrompng($image_path);

我已经确保我使用图像的绝对路径,仔细检查图像是否存在 (file_exists()),如果不存在则错误提示。不管我做什么,只要 imagecreatefrompng 未注释,我就会得到一个静默 500 错误。

编辑:我添加了 sn-p:

var_dump(is_readable($image_path));
var_dump(file_exists($image_path));

我的代码导致:

bool(true) bool(true)

所以看起来图像文件可以被 PHP 读取。我还验证了该图像是一个实际的 PNG 文件。还有其他想法吗?

【问题讨论】:

  • 没有日志,你怎么确定这个特定的行是 500 发生的地方?您是否在imagecreatefrompng() 之后立即添加了die() 以查看是否仍然出现HTTP 错误?
  • 您确定您正在跟踪正确的 php 日志文件吗? php -i | fgrep -i error 从命令行确保。还要确保 log_errors 已打开。
  • Farry:正如我在帖子中提到的,如果我注释掉该行,它会起作用。如果我取消注释 imagecreatefrompng 函数; 500 错误。
  • 迈克:是的。我已经跟踪了日志并使用 trigger_error 来确认输出。所有其他错误都显示在该文件中。日志错误已启用。
  • 我遇到了类似的问题:github.com/laradock/laradock/issues/1969 在 Docker PHP-FPM 中安装了 GD。已启用以及所有这些,但是当我尝试使用它而不是 Imagemagick(也已安装)时,它会导致错误 500 使用 Dropzone 上传图像并使用干预进行操作,而使用相同的图像和 Imagick 一切都很好。你有没有解决过这个问题@kagaku?

标签: php png gd freebsd


【解决方案1】:

你检查过文件权限了吗?

if(!file_exists($path) || !is_readable($path))....

有时它会吸引我。

而且,我不是这样,但是……你在这之前检查它是否真的是一个 png 文件??

【讨论】:

  • 我尝试添加:var_dump(is_readable($image_path)); var_dump(file_exists($image_path)); - 这个输出: bool(true) bool(true);我验证了该图像也是一个 png 文件。
猜你喜欢
  • 1970-01-01
  • 2022-11-03
  • 2017-01-10
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多