Этот вопрос связан с другим вопросом, который я написал:
Проблема с использованием DOTNET с PHP.
Где я использовал DOTNET()
в PHP для вызова DLL, которую я написал.
Я смог заставить его работать нормально, запустив php.exe example.php
из командной строки (при этом DLL все еще находится в папке PHP).
Я переместил файл php в папку веб-сервера IIS 7 на том же компьютере (оставив библиотеки DLL в одной и той же папке php), но я продолжаю получать внутреннюю служебную ошибку 500 .
Я проверил журналы сервера (в c:\inetput\logs\
и в c:\windows\temp\php53errors
), но, похоже, не существует какой-либо релевантной информации о том, что вызвало ошибку. Я даже пытался изменить настройки php.ini
, чтобы получить больше отзывов об ошибках, но это, похоже, не помогает.
Я могу только догадываться, что проблема может быть связана с:
Фактическая ошибка, которую я получаю:
Процесс FastCGI неожиданно вышел из системы.
Любая идея о том, как отладить эту проблему?
Проблема здесь почти наверняка связана с правами доступа к файлам.
Когда вы запускаете php.exe
из командной строки, вы запускаете ее как своего собственного зарегистрированного пользователя. При запуске PHP-скрипта из IIS в ответ на HTTP-запрос php.exe работает как другой пользователь. В зависимости от вашей версии Windows это может быть
IUSR_machine
– на IIS6 и ранее IUSR
на IIS7 и более поздних версиях Этим пользователям необходимы разрешения для исполняемого файла php.
Подробнее об этом
В IIS7 и более поздних версиях я использую средство командной строки icacls.exe
для установки разрешений на каталоги или файлы, которые должны быть прочитаны IIS и запущенными процессами (например, php.exe). Этот материал безопасности применяется ко всем приложениям IIS: PHP, ASPNET, ASP-classic, Python и т. Д.
IIS также должен иметь возможность читать статические файлы, такие как файлы .htm, .js, .css, .jpog, .png и т. Д. Вы можете установить одинаковые разрешения для всех: Read и Execute.
Вы можете предоставить разрешения непосредственно пользователю, например:
icacls.exe YOUR-FILE-GOES-HERE /grant "NT AUTHORITY\IUSR:(RX)"
Вы также можете предоставить разрешения группе, к которой принадлежит IUSR, например:
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(RX)"
В любом случае вам может потребоваться остановить и перезапустить IIS после установки разрешений на уровне файлов.
Если ваш скрипт .php читает и записывает другие файлы или каталоги, то одному и тому же пользователю нужны привилегии для этих других файлов и каталогов. Если вам нужен скрипт .php для удаления файлов, тогда вам может понадобиться
icacls.exe YOUR-FILE-HERE /grant "BUILTIN\IIS_IUSRS:(F)"
… который предоставляет полные права на файл.
Вы также можете предоставить разрешения для всей каталогов, указав, что все файлы, созданные в этом каталоге в будущем , наследуют разрешающие файлы разрешения, установленные в каталоге. Например, установите файл perms для каталога, затем скопируйте в него кучу файлов, и все файлы получат разрешения от родителя. Сделайте это с помощью флагов OI и CI (эти инициалы означают «наследование объекта» и «наследование контейнера»).
icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)" copy FILE1 DIRECTORY copy FILE2 DIRECTORY ...
Когда я хочу создать новый vdir в IIS, чтобы разрешить запуск PHP-скриптов или ASPX или .JS (да, ASP Classic) или Python или что-то еще, я делаю следующие шаги:
appcmd.exe add app /site.name:"Default Web Site" /path:/vdirpath /physicalPath:c:\docroot icacls.exe DIRECTORY /grant "BUILTIN\IIS_IUSRS:(OI)(CI)(RX)"
Затем я отбрасываю файлы в каталог и получаю соответствующие разрешения.
Установка ACL (списка управления доступом) в каталоге не изменит ACL для файлов, которые уже существуют в каталоге. Если вы хотите установить разрешения для файлов, которые уже находятся в каталоге, вам нужно использовать icacls.exe для определенных файлов. icacls принимает подстановочные знаки, а также имеет переключатель /t
который повторяется.