ImageMagick convert работает в командной строке, но не через PHP exec ()

Я использую PHP exec() для преобразования изображения с помощью convert ImagicMagick. Это выполняется на сервере CentOS.

 exec(convert http://img.ruphp.com/php/logo3w.png.jpg -resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg); 

Использование exec() не приводит к появлению нового изображения в папке назначения. Однако, если я должен был запустить ту же команду в оболочке, она работает отлично!

Я считаю, что это проблема PATH. Если да, то как я могу проверить путь, который использует PHP, и как я могу установить правильный путь в PHP?

Во-первых, вы должны попробовать с входным файлом, который действительно существует и извлекается:

  wget http://img.ruphp.com/php/logo3w.png.jpg

   --2012-08-21 20: 55: 24-- http://img.ruphp.com/php/logo3w.png.jpg
   Решение www.google.com (www.google.com) ... 173.194.35.179, 173.194.35.177, 173.194.35.178, ...
   Подключение к www.google.com (www.google.com) | 173.194.35.179 |: 80 ... подключено.
   HTTP-запрос отправлен, ожидая ответа ... 404 Не найдено
   2012-08-21 20:55:24 ОШИБКА 404: Не найдено.

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

 exec(which convert 2>/tmp/whichconvert.2 1>whichconvert.1) 

а также

 cat /tmp/whichconvert.{1,2} 

Наконец, попробуйте также полный путь convert :

 exec(/usr/local/full/path/to/convert logo: -resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg); 

а потом

 identify /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg 

Обновить:

Файл, который вы хотели получить, вероятно, не был logo3w.png.jpg , но logo3w.png :

   wget http://img.ruphp.com/php/logo3w.png
   --2012-08-21 21: 04: 22-- http://img.ruphp.com/php/logo3w.png
   Решение www.google.com (www.google.com) ... 173.194.35.180, 173.194.35.177, 173.194.35.179, ...
   Подключение к www.google.com (www.google.com) | 173.194.35.180 |: 80 ... подключено.
   HTTP-запрос отправлен, ожидая ответа ... 200 OK
   Длина: 7007 (6.8K) [image / png]
   Сохранение: 'logo3w.png'

   100% [=============================================== ======>>] 7,007 --.- K / s в 0.02s   

   2012-08-21 21:04:22 (451 КБ / сек) - 'logo3w.png' сохранен [7007/7007]

Кроме того, в случае , если он работает только для локальных файлов (а не удаленных http-URI), вам может потребоваться проверить, действительно ли HTTP-делегат, используемый convert , действительно установлен в вашей системе:

 convert -list delegate | grep http https => "/opt/local/bin/curl" -s -k -o "%o" "https:%M" 

Кроме того, проверьте, действительно ли учетная запись пользователя, на которой работает ваш PHP, имеет право писать в целевой каталог:

 exec(touch /home/mysite/public_html/public/img/posts/original/touchtest); 

а потом

 ls -l /home/mysite/public_html/public/img/posts/original/touchtest 
 function execute($command) { # remove newlines and convert single quotes to double to prevent errors $command = str_replace(array("\n", "'"), array('', '"'), $command); # replace multiple spaces with one $command = preg_replace('#(\s){2,}#is', ' ', $command); # escape shell metacharacters $command = escapeshellcmd($command); # execute convert program return shell_exec($command); // or whatever you like } 

Что для меня работало, это полный путь к двоичному файлу ImageMagick . Вместо convert используйте /path/to/convert .

 $command = $this->imageMagickFullBinaryPath . ' -resize ' . $dimensions . ' ' . $imageFileToResize . ' ' . $resultingThumbnail; exec($command, $output);