Разрешение ImageMagic отклонено в IIS

У меня установлено ImageMagick-6.9.2-8-Q16-x64-dll.exe с GhostScript на Windows Server 2012 R2.

Выполнение командной строки convert "document.pdf" "thumbnail.jpg" из PHP с использованием shell_exec или exec завершается с ошибкой, возвращая значение 1. Если я запускаю ту же команду вручную в командной строке (cmd.exe), она без проблем создает файл PDF.


person Beakal    schedule 15.12.2015    source источник


Ответы (2)


Прочитав множество статей и форумов, я предпринял следующие шаги, чтобы заставить ImageMagic работать в среде IIS.

  1. Разрешение на временный каталог: всякий раз, когда PHP загружает файл на сервер, IIS помещает файл в каталог C:\Windows\Temp и перемещает его в каталог назначения. В этом процессе загруженный файл получит право собственности и разрешение из временного каталога. По умолчанию это наследование не позволит ImageMagic получить к нему доступ. Чтобы обойти это ограничение, IUSR и IIS_USRS должны иметь разрешение на чтение/запись в каталоге Temp. Для подробного объяснения прочитайте это статья.
  2. Разрешение Image Magic/идентификатор пула приложений: поскольку PHP не разрешено выполнять convert.exe, когда он обслуживается пользователем IIS, вам необходимо создать/использовать пул приложений по умолчанию в IIS. После того, как этот пул настроен, вы должны предоставить разрешение этому пулу в каталоге ImageMagic и каталоге, в котором находится файл pdf. Подробное объяснение читайте в этой теме. Примечание. В некоторых статьях предлагается разрешить IUSR или IIS_IUSR выполнять cmd.exe. Это крайне не рекомендуется, так как может создать окно для нарушения безопасности.
  3. Разрешения для исходного и целевого каталога: оба этих каталога должны иметь права на чтение/запись IUSR и IIS_IUSR.
  4. Синтаксис командной строки: распространенными ошибками при передаче аргументов в командную строку из PHP являются пути, обратную косую черту необходимо экранировать. Например, вместо передачи C:\Inetpub\vhosts\... его следует передать как C:\\Inetpub\\vhosts\\.... Вот пример рабочего фрагмента:

$cmd = 'convert "C:\\Inetpub\\vhosts\\a\\doc.pdf[0]" "C:\\Inetpub\\vhosts\\b\\thumb\\a.jpg"';
$output = "";
$result = exec($cmd, $output);

print_r($output); //var_dump($output);

Обратите внимание, что вся команда заключена в одинарные кавычки, а исходный и конечный файлы заключены в двойные кавычки.

Отладка: PHP не сообщает об ошибках, которые могут возникнуть во время выполнения командной строки. Если возникает ошибка, он молча терпит неудачу. Для отладки вывода, отправленного из командной строки, рекомендуется использовать exec. Эта функция позволяет передать выходную переменную, которая будет заполнена массивом, содержащим ответ из командной строки. Отсюда вы можете использовать var_dump, print_r для отображения вывода. Если это значение имеет значение 1 или 4, это означает, что у вас все еще есть проблема с правами доступа, которую необходимо решить :(

Надеюсь, это поможет.

person Beakal    schedule 17.12.2015

Мы наблюдали ту же проблему в приложении ASP.NET. Мы решили эту проблему, убедившись, что правильно разместили объект ImageMagick.

Примечание. Мы обернули объект ImageMagick внутри использования инструкции. Это не сработало. Мы явно закрыли этот объект.

person Venkata Varagani    schedule 09.06.2019