2

在 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"); ?>

只是一个注释。我输入了详细信息,以便我可以确定我实际上正在运行程序,并且返回了一些输出。它还表明它正在加载正确的文件。这也是我使用 passthru 而不是 exec 或 system 的原因。这只是一个测试脚本。我在它坏掉之前使用的脚本没有使用 passthru,但是要发布的东西太多了。关键是执行的字符串在php中不起作用,但在命令行中起作用,所以它是正确的。

4

2 回答 2

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(...)

如果你坚持要在stderr输出中添加一些噪音,你可以尝试添加-monitor参数而不是-verbose...

于 2012-08-21T19:37:57.577 回答
2

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

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

putenv("MAGICK_THREAD_LIMIT=1");
于 2012-08-25T00:13:12.387 回答