在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中不起作用,但在命令行上工作正常。
答案 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'>
注意... 强>
...我删除了-verbose
部分(它只在 stderr startline/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
...
答案 1 :(得分:2)
我刚刚遇到了同样的问题。我注意到的真正奇怪的事情是,如果图像恰好是我试图调整大小的确切大小,那么它就可以了。 Anywawy,这似乎是内存使用的问题,可以通过PHP中的配置设置来修复。浏览其他论坛后,我发现了这个并修复了它。
将此行放在调用imagemagick的PHP脚本的顶部:
putenv("MAGICK_THREAD_LIMIT=1");