Я написал небольшой класс 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.