Идеи отладки вызова в GraphicsMagick из PHP - PullRequest
1 голос
/ 23 декабря 2010

Я написал небольшой класс PHP, который в основном вызывает gm convert из GraphicksMagick 1.3.12 через exec () для изменения размера изображения.Пользователи с живого сайта сообщают о проблемах, и я также смог воспроизвести некоторые проблемы в моем окне разработки.

Соответствующий код выглядит следующим образом:

<?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.На сайте разработчика я могу случайно увидеть, как cmd.exe процесс остается бездействующим вечно, используя 0% ЦП, пока я не убью задачу.

Учитывая, что это внешний инструмент, у меня закончились идеи о том, что делатьследующий.Как я могу устранить эту проблему?

Обновление # 1

Я исправил небольшую ошибку в несвязанном куске кода, и я вхожу в файл каждый отдельный шагЯ мог бы подумать (включая деятельность gm.exe с -debug All), но я иду в никуда.PHP достигает вызова exec () и gm.exe продолжает работать вечно, ничего не делая.

Update # 2

Я получил точную команду, выполняемую двумя способами, echo в файле журнала показывает это:

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

Я могу запустить обе команды вручную, хотя вторая запускается только из Пуск-> Выполнить (не из командной строки), если я не заключу в двойные кавычки все выражение .

В любом случае, я вполне уверен, что команда выполняется должным образом, потому что я все время получаю измененное изображение, и журнал отладки, сгенерированный gm, выглядит нормально.Последняя строка всегда выглядит так, когда она останавливается, а когда нет:

13: 53: 52 0:03 3.016u 2344 module.c / UnloadModule / 2180 / Configure: UnloadingМодуль "JPEG" ...

Я подозреваю, что есть что-то, что мешает завершению процесса по завершении: сканер вирусов, расширение оболочки или что-то ...

Все этоначинает не стоить усилий быть исправленным.Я подумаю о переходе на ImageMagick или обычные изображения функций PHP.

Обновление # 3

Забавно ... Я перешел на ImageMagick и получаюточно такая же проблема!И я могу воспроизвести его всегда : мне просто нужно открыть две вкладки браузера.

Очевидно, что я забыл, как запускать команды из PHP.Я думаю, что я попытаюсь изменить размер изображения с помощью чистого кода PHP.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Я нашел решение благодаря коллеге:

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

На серверах Windows-Apache-PHP существует проблема с использованием команды exec более чемодин раз в то же время.Если скрипт (с командой exec) загружается одним и тем же пользователем более одного раза, сервер останавливается.В моем случае в качестве источника тега изображения использовался PHP-скрипт с использованием команды exec.Больше чем одно изображение в одном HTML заставило сервер остановиться.Проблема описана здесь (http://bugs.php.net/bug.php?id=44942) вместе с решением - остановите сеанс перед командой exec и запустите его снова после нее.

<?php

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

?>
0 голосов
/ 23 декабря 2010

Вы распечатали точную команду, которая выполняется?(и проверяли ли вы эту напечатанную строку на наличие очевидных ошибок?)

Пробовали ли вы выполнить эту точную команду непосредственно из командной строки (т.е. отдельно от PHP)?Работает ли в этом контексте или также блокируется там?

Если точно такая же команда работает при запуске отдельно, то у вас может быть проблема с тем, как вы используетеPHP для вызова внешней команды.

Если она не работает , то, скорее всего, у вас либо ошибка в параметрах командной строки, которую вы задаете GM, либо, возможно, вы нашлиошибка в самом GM.

В любом случае, это должно помочь вам лучше справиться с проблемой, где происходит ошибка.

Еще одна вещь, которую я бы предложил, это добавить папку GM в вашу систему.путь, так что вы можете просто вызвать команду gm самостоятельно, а не define весь путь.

Да, и, кстати, вы знаете, что PHP имеет правильное расширение GraphicsMagik?Это означало бы, что вам не нужно вызывать его, используя exec.Вам нужно будет установить его из PECL, но, возможно, оно того стоит ... См. http://devzone.zend.com/article/10531

...