imagemagik convert命令在php脚本中不能正常工作,但可以从命令行中工作


imagemagick convert command not working correctly in php script but does work from command line

在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的技术支持人员表示,问题是外场不存在,并结案。这并没有多大帮助。

我想知道是否有什么东西需要放在php.ini文件中。


我也尝试过:exec("/usr/bin/convert-resize 200x200 image/temp222_main_menu.png");?>

只是一张纸条。我加入了verbose,这样我就可以确定我实际上正在运行程序,并且返回了一些输出。它还显示它正在加载正确的文件。这也是我使用passthrough而不是exec或system的原因。这只是一个测试脚本。我在崩溃前使用的脚本没有使用passthrough,但有太多内容要发布。关键是执行的字符串在php中不起作用,但在命令行上起作用,因此它是正确的。

我刚刚遇到了同样的问题。我注意到的一件非常奇怪的事情是,如果图像恰好是我试图调整大小的大小,那么它就起作用了。总之,这似乎是内存使用的问题,可以通过PHP中的配置设置来解决。在浏览其他论坛后,我发现了这一点,并将其修复。

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

putenv("MAGICK_THREAD_LIMIT=1");

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

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

<?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部分(它只在stderrstartline/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(...)

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

相关文章: