在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'>
注意
。。。我删除了
-verbose
部分(它只在stderrstartline/main_menu.png PNG 600x1024 600x1024+0+0 8-bit DirectClass 92.1KB 0.020u 0:00.020
上生成一行,这可能是convert命令从未完成转换的原因。。。。我没有使用您的
-version
修改,因为它在您的上下文中没有意义(这也导致跳过-resize
部分)。。。。我删除了您的
<IMG SRC=....
行中的一个空格。。。。我切换到
exec(...)
如果您坚持要向stderr输出添加一些噪声,可以尝试添加-monitor
参数而不是-verbose
。。。