Domanda

Ho scritto un po 'di classe PHP che chiama in fondo gm convert da GraphicksMagick 1.3.12 via exec () per ridimensionare una foto. Gli utenti del sito live stanno segnalando problemi e sono stato in grado di riprodurre alcuni problemi nella mia casella di sviluppo pure.

L'aspetto relativo codice come questo:

<?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));
    }
}

piste del sito vivere sotto PHP / 5.2.9-2 e dev sito gira PHP / 5.3.0. Entrambe le scatole eseguire Windows Server 2003, Apache / 2.2 e GraphicsMagick 1.3.112 Q16.

Nel sito live mi sto un'eccezione con codice di ritorno 1. Nel sito dev posso casualmente vedere come un processo di soggiorni cmd.exe inoperosi per sempre, utilizzando 0% della CPU fino a quando ho ucciso il compito.

Dato che è uno strumento esterno, ho a corto di idee su cosa fare dopo. Come posso risolvere il problema?

Aggiornamento # 1

I fissato un piccolo bug in un pezzo non collegato di codice e sto accedendo a un file di ogni singola fase che potrei pensare (compresa l'attività di gm.exe con -debug All), ma sto andando da nessuna parte. PHP raggiunge le exec () di chiamata e gm.exe resti in esecuzione per sempre non fare nulla.

Aggiornamento # 2

Ho il comando esatto in esecuzione in due modi. Un echo in un file di log mostra questo:

"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"

Nelle proprietà di processo, come indicato da Process Explorer l'aspetto della riga di comando come in questo modo:

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""

Sono in grado di eseguire entrambi i comandi manualmente, anche se il secondo viene eseguito solo da Start-> Esegui (non da un prompt dei comandi) a meno che virgolette l'intera espressione .

In ogni caso, io sono ragionevolmente sicuri che il comando viene eseguito come previsto, perché io capisco l'immagine ridimensionata tutti i tempi e il registro di debug generato da sguardi gm normali. L'l'ultima riga è sempre così, quando si bancarelle e quando non lo fa:

13:53:52 00:03 3.016u 2344 module.c / UnloadModule / 2180 / Configurazione: Scarico "JPEG" modulo ...

Ho il sospetto di qualcosa che ci impedisce il processo di uscire una volta fatto: un programma antivirus, un'estensione della shell o qualcosa del genere ...

Il tutto sta cominciando a non essere vale la pena di esserlo. Prenderò in considerazione il passaggio a ImageMagick o le immagini delle funzioni PHP.

Aggiornamento # 3

divertente ... ho passato a ImageMagick e sto ottenendo lo stesso problema esatto! E posso riprodurre sempre :. Ho solo bisogno di due schede del browser aperte

E 'ovvio che non mi ricordo come eseguire comandi da PHP. Credo che cercherò di ridimensionare l'immagine con codice PHP puro.

È stato utile?

Soluzione 2

Ho trovato la soluzione grazie ad un collega:

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

su server Windows-Apache-PHP c'è un problema utilizzando il comando exec più di una volta allo stesso tempo. Se una sceneggiatura (con il comando exec) è caricato più volta dallo stesso utente allo stesso tempo, il server sarà congelare. Nel mio caso lo script PHP utilizzando il comando exec è stata usata come fonte di un tag immagine. Più di una immagine in un formato HTML ha reso il server fermare. Il problema è descritto qui (Http://bugs.php.net/bug.php?id=44942) assieme con una soluzione - fermare il la sessione prima del comando exec e riavviarlo dopo di esso.

<?php

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

?>

Altri suggerimenti

Avete stampato il comando esatto che sta ottenendo eseguito? (E avete controllato la stringa stampata per eventuali errori evidenti?)

Hai provato a correre quel comando esatto direttamente dalla linea di comando (cioè separatamente dal PHP)? Funziona in quel contesto, o lo fa anche rinchiudere lì?

Se l'esatto stesso comando lavori quando viene eseguito a parte, allora si può avere un problema con il modo in cui si sta utilizzando PHP per chiamare il comando esterno.

Se non funziona , probabilmente hai sia un errore nei parametri della riga di comando si sta dando GM, o forse aver trovato un bug in GM per sé.

In ogni caso, questo dovrebbe aiutare a capire meglio quello in cui si verifica l'errore.

Un'altra cosa che suggerirei è aggiunta la cartella GM al percorso di sistema, in modo da poter chiamare il comando gm da solo, piuttosto che dover define tutto il percorso.

Oh, e tra l'altro, si lo so che PHP ha un'estensione destra GraphicsMagik? Ciò significherebbe che non avrebbe bisogno di chiamare utilizzando exec. Avresti bisogno di installarlo da PECL, ma potrebbe essere la pena ... Vedere http: // DevZone .zend.com / article / 10531

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top