Ich habe eine kleine PHP-Klasse geschrieben, die im Grunde ruft gm convert
von GraphicksMagick 1.3.12 über exec(), um die Größe eines Bildes zu ändern. Benutzer von der Live-Site melden Probleme, und ich konnte auch einige Probleme in meiner Entwicklungsumgebung reproduzieren.Ideen zum Debug Aufruf von GraphicsMagick von PHP
Der entsprechende Code sieht wie folgt aus:
<?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));
}
}
Live-Website läuft unter PHP/5.2.9-2 und Entwickler-Website läuft PHP/5.3.0. Beide Felder führen Windows Server 2003, Apache/2.2 und GraphicsMagick 1.3.112 Q16 aus.
In Live-Site bekomme ich eine Ausnahme mit Return-Code 1
. In der Entwickler-Website kann ich zufällig sehen, wie ein cmd.exe
Prozess für immer im Leerlauf bleibt, mit 0% CPU, bis ich die Aufgabe zu töten.
Da es ein externes Tool ist, habe ich keine Ideen mehr, was ich als nächstes tun soll. Wie kann ich dieses Problem beheben?
Update # 1
ich einen kleinen Fehler in einem nicht verwandten Stück Code festgelegt, und ich bin in eine Datei jeder einzelne Schritt der Anmeldung konnte ich denke an (einschließlich gm.exe
‚s Aktivität mit -debug All
), aber ich Ich gehe nirgendwohin. PHP erreicht den exec() -Aufruf und gm.exe
bleibt für immer laufen nichts tun.
Update # 2
ich die genaue Befehl durch zwei Mittel habe ausgeführt wird. Ein Echo in eine Protokolldatei zeigt dies:
"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"
In den Prozesseigenschaften wie Process Explorer die Befehlszeile sieht wie folgt dargestellt:
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""
Ich bin in der Lage zu laufen beiden Befehle manuell obwohl die zweite läuft nur von Start -> Ausführen (nicht von einer Eingabeaufforderung), außer ich double quote the whole expression.
In jedem Fall bin ich mir ziemlich sicher, dass der Befehl wie erwartet ausgeführt wird, weil ich das skalierte Bild die ganze Zeit bekomme und das von gm erzeugte Debug-Log normal aussieht. Die letzte Zeile sieht immer so aus, als es Stände und wenn dies nicht der Fall:
13:53:52 0:03 3.016u 2344 module.c/UnloadModule/2180/Configure: Entladen " JPEG“Modul ...
ich vermute, gibt es etwas, das den Prozess austreten verhindert, wenn getan: einen Virenscanner, eine Shell-Erweiterung oder etwas ...
Das ganze beginnt nicht wert zu sein die Anstrengung, fixiert zu sein. Ich werde über einen Wechsel zu ImageMagick oder einfachen PHP-Funktionsbildern nachdenken.
Update # 3
Lustig ... Ich habe zu ImageMagick geschaltet und ich exakt das gleiche Problem bekommen!Und ich kann es reproduzieren immer: Ich muss nur zwei Browser-Registerkarten öffnen.
Es ist offensichtlich, dass ich vergessen habe, Befehle von PHP auszuführen. Ich denke, ich werde versuchen, das Bild mit reinem PHP-Code zu skalieren.
Ich habe protokolliert sowohl den genauen Befehl und aus dem Prozess (mit Process Explorer) gelesen und es funktioniert an der Eingabeaufforderung in Ordnung (tatsächlich, ich habe zuerst den ins Stocken geraten Prozess zu töten, weil die Ausgabedatei ist gesperrt). Ich werde Ihre anderen Vorschläge berücksichtigen. –