2010-12-23 7 views
1

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.

Antwort

0

ich die Lösung dank einem Mitarbeiter gefunden:

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

Auf Windows- Apache-PHP-Server gibt es ein Problem mit der exec-Befehl mehr als einmal zur gleichen Zeit. Wenn ein Skript (mit dem Befehl exec) mehr als einmal vom selben Benutzer gleichzeitig geladen wird, wird der Server einfrieren. In meinem Fall wurde das PHP-Skript mit dem Befehl exec als Quelle eines Image-Tags verwendet. Mehr als ein Bild in einem HTML machte den Server zu stoppen. Das Problem ist hier beschrieben (http://bugs.php.net/bug.php?id=44942) zusammen mit einer Lösung - stoppen Sie die Sitzung vor dem Befehl exec und starten Sie es erneut danach.

<?php 

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

?> 
0

Haben Sie den exakten Befehl ausgedruckt, der ausgeführt wird? (und haben Sie diese gedruckte Zeichenkette auf offensichtliche Fehler überprüft?)

Haben Sie versucht, diesen genauen Befehl direkt von der Befehlszeile (dh getrennt von PHP) auszuführen? Funktioniert es in diesem Kontext oder schließt es dort auch ab?

Wenn die exakt gleichen Befehl funktioniert, wenn separat laufen, dann können Sie ein Problem mit der Art und Weise haben Sie PHP verwenden den externen Befehl aufzurufen.

Wenn es nicht funktioniert, dann haben Sie wahrscheinlich entweder einen Fehler in der Befehlszeile Parameter geben Sie GM, oder möglicherweise haben Sie einen Fehler in GM selbst gefunden.

In jedem Fall sollte dies Ihnen helfen, einen besseren Griff zu bekommen, wo der Fehler auftritt.

Eine andere Sache, ich würde vorschlagen, ist die GM-Ordner auf Ihrem Systempfad hinzufügen, so dass Sie kann allein die gm Befehl rufen Sie einfach an, anstatt den ganzen Weg zu define haben.

Oh, und übrigens, Sie wissen, dass PHP eine GraphicsMagik Erweiterung hat, richtig? Das würde bedeuten, dass Sie es unter exec nicht anrufen müssten. Sie müssten es von PECL installieren, aber es könnte sich lohnen, ... Siehe http://devzone.zend.com/article/10531

+0

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. –