imagemagick convert命令在php脚本中无法正常工作,但可以从命令行工作

时间:2012-08-21 16:16:07

标签: php imagemagick imagemagick-convert

在php中进行转换的系统调用工作了多年,但今年早些时候退出了工作。如果使用Putty从命令行发出,我正在使用的所有命令都能正常工作。

我为调试而创建的测试php文件是

<?  
$string = "convert  -verbose -resize 200x200  \"startline/main_menu.png\" \"image/temp222_main_menu.png\" ";
passthru($string);
?>

<IMG SRC='image/temp222_main_menu.png '  alt='main_menu'>

未创建输出文件。我收到了这个回复

startline/main_menu.png PNG 600x1024 600x1024+0+0 8-bit DirectClass 92.1KB 0.020u 0:00.020

如果我用这个

替换我的字符串
$string = "convert  -version -resize 200x200  \"startline/main_menu.png\" \"image/temp222_main_menu.png\" ";

创建输出文件但未调整大小。

我收到了这个回复:

Version: ImageMagick 6.6.0-4 2012-04-26 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2010 ImageMagick Studio LLC Features: OpenMP

有趣的是,这项工作从2008年开始到今年年初。这可能是我切换到PHP5和新服务器时,不确定。这是在1and1.com

运行

1and1的技术支持表示问题是outfile不存在并关闭了案例。这不是很有帮助。

我想知道是否需要在php.ini文件中添加某些东西。


我也试过这个:          exec(“/ usr / bin / convert -resize 200x200 image / temp222_main_menu.png”);     ?&GT;     

请注意。我把详细信息放入,以便我可以确定我实际上正在运行程序,返回了一些输出。它还显示正在加载正确的文件。这也是我使用passthru而不是exec或system的原因。这只是一个测试脚本。我在破坏之前使用的脚本没有使用passthru但是有太多的帖子要发布。关键是执行的字符串在php中不起作用,但在命令行上工作正常。

2 个答案:

答案 0 :(得分:2)

您应该尝试以下步骤来调试问题。

首先,通过提供所有文件名和命令的完整路径来验证设置是否正常工作:

<?php  
exec("which convert");
?>

<?php  
exec("/path/to/convert  /path/to/a.png  -resize 200x200  /tmp/a200x200.png");
?>

(显然,你必须根据自己的情况调整路径。)

然后,检查您的PHP运行的用户帐户是否具有写入目标目录的权限:

<?php  
exec("pwd");
exec("touch $(pwd)/image/temp222_main_menu.png");
?>

我会将您的代码更改为此以使其正常工作:

<?php  
exec("/usr/bin/convert -resize 200x200  image/temp222_main_menu.png");
?>

<IMG SRC='image/temp222_main_menu.png'  alt='main_menu'>

注意...

  1. ...我删除了-verbose部分(它只在 stderr startline/main_menu.png PNG 600x1024 600x1024+0+0 8-bit DirectClass 92.1KB 0.020u 0:00.020上生成了一个额外的行,这可能是convert命令永远不会完成的原因转换。

  2. ...我没有使用您的-version修改,因为它在您的上下文中没有意义(并且它也会导致跳过-resize部分)。

  3. ...我删除了<IMG SRC=....行中的空格。

  4. ...我切换到exec(...)

  5. 如果您坚持向 stderr 输出添加一些噪音,可以尝试添加-monitor参数而不是-verbose ...

答案 1 :(得分:2)

我刚刚遇到了同样的问题。我注意到的真正奇怪的事情是,如果图像恰好是我试图调整大小的确切大小,那么它就可以了。 Anywawy,这似乎是内存使用的问题,可以通过PHP中的配置设置来修复。浏览其他论坛后,我发现了这个并修复了它。

将此行放在调用imagemagick的PHP脚本的顶部:

putenv("MAGICK_THREAD_LIMIT=1");