我已经写了一个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代码调整图片大小。
我都记录确切的命令,并从工艺(用的Process Explorer)读它,它工作正常,从命令提示符(实际上,我要杀死停滞不前的过程首先是因为输出文件被锁住了)。我会考虑你的其他建议。 – 2010-12-23 15:19:58