gm convert
基本的に、GraphicsMagick 1.3.12 から exec() を介して呼び出して画像のサイズを変更する小さな PHP クラスを作成しました。ライブ サイトのユーザーが問題を報告しており、私の開発ボックスでもいくつかの問題を再現できました。
関連するコードは次のようになります。
<?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 を実行します。
ライブ サイトで return code の例外が発生します1
。cmd.exe
開発サイトでは、タスクを強制終了するまで 0% の CPU を使用して、プロセスが永久にアイドル状態のままになる様子をランダムに確認できます。
これが外部ツールであることを考えると、次に何をすべきかについてのアイデアが尽きてしまいました。この問題のトラブルシューティング方法を教えてください。
更新 #1
関係のないコードの小さなバグを修正し、考えられるすべてのステップ (gm.exe
のアクティビティを含む-debug All
) ごとにファイルにログインしていますが、どこにも行きません。PHP は exec() 呼び出しに到達し、 gm.exe
何もせずに永久に実行され続けます。
アップデート #2
正確なコマンドが 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""
両方のコマンドを手動で実行できますが、式全体を二重引用符で囲まない限り、2 つ目のコマンドは (コマンド プロンプトからではなく) Start->Run からのみ実行されます。
いずれにせよ、サイズ変更された画像を常に取得し、gm によって生成されたデバッグ ログが正常に見えるため、コマンドが期待どおりに実行されることはかなり確信しています。最後の行は、停止するときと停止しないとき、常に次のようになります。
13:53:52 0:03 3.016u 2344 module.c/UnloadModule/2180/Configure: 「JPEG」モジュールをアンロード中 ...
完了時にプロセスが終了するのを妨げる何かがあるのではないかと思います:ウイルススキャナー、シェル拡張など...
全体が、修正する努力に見合う価値がなくなり始めています。ImageMagick またはプレーンな PHP 関数イメージに切り替えることを検討します。
アップデート #3
面白い... ImageMagick に切り替えましたが、まったく同じ問題が発生しています。そして、いつでも再現できます。ブラウザのタブを 2 つ開くだけです。
PHP からコマンドを実行する方法を忘れてしまったことは明らかです。純粋な PHP コードで画像のサイズを変更しようと思います。