2010-12-23 19 views
1

我已经写了一个PHP类,基本上从GraphicksMagick 1.3.12调用gm convert通过exec()来调整图片大小。来自现场的用户正在报告问题,我也能够在我的开发框中重现一些问题。想法调试从PHP调用GraphicsMagick

相关的代码如下所示:

<?php 

define('GM_PATH', 'C:\\Archivos de programa\\GraphicsMagick-1.3.12-Q16\\gm.exe'); 

[...] 

private function resize($width, $height, $do_not_upscale=TRUE){ 
    $source = escapeshellarg($this->source_file); 
    $target = escapeshellarg($this->target_file); 
    $command = escapeshellarg(GM_PATH) . ' convert '; 
    $parameters = array(); 

    $parameters[] = $source; 
    $parameters[] = sprintf('-resize "%dx%d%s"', round($width), round($height), $do_not_upscale ? '>' : ''); 
    $parameters[] = '+profile "*"'; 
    $parameters[] = $target; 

    $execute = $command . ' ' . implode(' ', $parameters) . ' 2>&1'; 

    exec($execute, $output, $return); 
    if($return==0){ 
     return $this->target_file; 
    }else{ 
     throw new Exception('Image resizing failed: return code ' . $return . ': ' . implode(PHP_EOL, $output)); 
    } 
} 

直播现场PHP下运行/ 5.2.9-2和开发站点运行PHP/5.3.0。两个盒子都运行Windows Server 2003,Apache/2.2和GraphicsMagick 1.3.112 Q16。

在生活网站我收到一个异常,返回码1。在dev站点中,我可以随机看到cmd.exe进程如何保持空闲状态,直到我终止任务为止,使用0%的CPU。

鉴于这是一个外部工具,我已经没有关于接下来要做什么的想法。我如何解决这个问题?

更新#1

我无关的代码固定的一个小错误,我登录到一个文件中的每个单独的一步,我能想到的(包括gm.exe的与-debug All活动),但我没有任何意义。 PHP到达exec()调用并且gm.exe仍然永远无法运行。

更新#2

我已经得到了确切的指令通过两个方式来执行。一个回声到日志文件中示出了这一点:

"C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe" convert -debug All "\\SHARE\Project\tmp\mini_4d13465d4bc4b.jpg" -resize "1024x1024>" +profile "*" "\\SHARE\Project\tmp\mini_4d13465dafddd.jpg" 2>>"//SHARE/Project/Miniatura-01.log" 

在该过程特性如图Process Explorer命令行看起来像这样:

cmd.exe /c ""C:\Archivos de programa\GraphicsMagick-1.3.12-Q16\gm.exe" convert -debug All "\\SHARE\Project\tmp\mini_4d13465d4bc4b.jpg" -resize "1024x1024>" +profile "*" "\\SHARE\Project\tmp\mini_4d13465dafddd.jpg" 2>>"//SHARE/Project/Miniatura-01.log"" 

我能够手动虽然运行这两个命令第二个只能从开始 - >运行(不是来自命令提示符),除非我double quote the whole expression

在任何情况下,我都相当确定该命令按预期得到执行,因为我一直获得调整大小的图像,并且由gm生成的调试日志看起来很正常。在最后一行总是看起来是这样的,当它档,当它没有:

13时53分52秒0:03 3.016u 2344 的module.c/UnloadModule/2180 /配置: 卸载“ JPEG”模块......

我怀疑那里的东西,使进程无法完成时退出:病毒扫描仪,外壳扩展或东西...

整个事情的开始不值得被修复的努力。我会考虑切换到ImageMagick或纯PHP功能图像。

更新#3

滑稽......我切换到ImageMagick的和我得到完全相同的问题!我可以重现它总是:我只需要打开两个浏览器选项卡。

很明显,我已经忘记了如何从PHP运行命令。我想我会尝试使用纯PHP代码调整图片大小。

回答

0

我找到了解决办法多亏了同事:

http://es2.php.net/manual/en/function.exec.php#99781

在Windows的Apache-PHP服务器存在 多次使用exec命令 的问题。如果 脚本(使用exec命令)是 同时服务器将 冻结加载不止一次由同一用户 。在我的情况下,使用exec命令的PHP脚本 被用作图像标签的 源。一个HTML中的多个 图像使服务器 停止。这里描述的问题可以通过一个解决方案来解决 - 在exec命令和 之后再次启动会话之前停止 会话。

<?php 

session_write_close(); 
exec($cmd); 
session_start(); 

?> 
0

你打印出来是越来越执行的确切命令? (和你检查了打印字符串是否有明显的错误?)

您是否尝试过直接在命令行中运行的确切命令(即独立于PHP)?它在这种情况下工作,还是它也锁定在那里?

如果完全相同的命令在单独运行时工作,那么您可能在使用PHP调用外部命令时遇到问题。

如果它不起作用,那么你可能在你给GM的命令行参数中有一个错误,或者你可能在GM中找到了错误。

无论哪种方式,这会帮助你得到一个更好的处理一个在错误发生。

我建议的另一件事是将GM文件夹添加到您的系统路径中,因此您可以自己调用gm命令,而不必使用define整个路径。

哦,顺便说一下,你就知道,PHP有GraphicsMagik扩展吗?这意味着你不需要使用exec来调用它。你需要从PECL安装它,但它可能是值得的...查看http://devzone.zend.com/article/10531

+0

我都记录确切的命令,并从工艺(用的Process Explorer)读它,它工作正常,从命令提示符(实际上,我要杀死停滞不前的过程首先是因为输出文件被锁住了)。我会考虑你的其他建议。 – 2010-12-23 15:19:58