Я написал этот быстрый и грязный обходной путь:
<?php
class Thumb{
const GM_PATH = 'C:\\Archivos de programa\\GraphicsMagick-1.3.12-Q16\\gm.exe';
/**
* Quote full command if required by server (program + arguments)
*/
private static function quoteFullCommand($command){
// Test only once per script
static $extra_quotes_required=NULL;
if( is_null($extra_quotes_required) ){
if(PHP_OS=='WINNT'){
// This call will be correct (0) if and only if the server requires extra quotes
exec('""sort" /?"', $output, $return);
$extra_quotes_required = $return==0;
}else{
$extra_quotes_required = FALSE;
}
}
if($extra_quotes_required){
$command = '"' . $command . '"';
}
return $command;
}
/**
* Return output from "gm version"
*/
public static function graphicsMagickVersion(){
$command = escapeshellarg(self::GM_PATH) . ' version ';
$command = self::quoteFullCommand($command);
exec($command, $output, $return);
return trim(implode(PHP_EOL, $output));
}
}
Однако было бы лучше предсказать его по версии PHP или серверной ОС, так что ссылки на документацию или дополнительные советы приветствуются.
Обновление: Я посмотрел на фрагмент исходного кода PHP, который заботится о запуске внешних команд в Windows:
http://svn.php.net/viewvc/php/php-src/trunk/TSRM/tsrm_win32.c
Следующая строка добавляет дополнительные запятые к полной команде:
sprintf(cmd, "%s /c \"%s\"", TWG(comspec), command);
Согласно истории файлов, эта строка была впервые добавлена 29 мая 2008 г. ( r260429 ):
MFH: Исправлена ошибка, когда команда заключалась в кавычки, а параметры заключались в кавычки во время вызова exec, в результате cmd.exe / c удаляет первую и последнюю кавычку.
СледующееРелизы PHP были 5.3.0 и 5.2.7, но строка находится в ветке 5_3, а не в 5_2.Я недостаточно знаком с процессом разработки PHP, поэтому не могу найти журнал изменений или сказать, к каким именно версиям PHP было перенесено исправление, но я бы осмелился сказать, что это ошибка в PHP, и она была исправлена в PHP/5.3.0 (но это не было перенесено в 5.2, чтобы они не ломали устаревшие вещи).
Так что мой обходной путь, вероятно, излишним.Вам просто нужно проверить ОС PHP и версию:
if( PHP_OS=='WINNT' && version_compare(PHP_VERSION, '5.3.0', '<') ){
$command = $command = '"' . $command . '"';
}