0

У меня есть ImageMagick-6.9.2-8-Q16-x64-dll.exe с GhostScript на Windows Server 2012 R2.ImageMagic Разрешение отклонено на IIS

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

ответ

1

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

  1. разрешение каталога Temp: Всякий раз, когда PHP загружает файл на сервер, IIS будет поместить файл в C:\Windows\Temp каталог и переместить его в папку назначения. В этом процессе загруженный файл будет принадлежать владельцу и разрешению из каталога Temp. По умолчанию это наследование будет препятствовать доступу ImageMagic к нему. Чтобы преодолеть это ограничение, IUSR и IIS_USRS должны иметь разрешение на чтение/запись в каталоге Temp. Подробнее об этом читайте article.
  2. Изображение Магическое разрешение/идентификатор пула приложений: Поскольку PHP не разрешен для выполнения convert.exe во время обслуживания под пользователем IIS, вам необходимо создать/использовать пул приложений по умолчанию в IIS. После того как этот пул настроен, вы должны предоставить разрешение этому пулу в каталоге ImageMagic и в каталоге, где находится файл PDF. Для подробного объяснения читайте это thread. Примечание. В некоторых статьях рекомендуется, чтобы 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, это означает, что у вас все еще есть проблема с разрешением, которую вы должны решить :(

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

Смежные вопросы