2010-12-23 61 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