Microsoft IIS 7.0 и выше
Этот раздел содержит инструкции по настройке Internet Information Services (IIS) 7.0 и более поздних версий для работы с PHP на Microsoft Windows Vista SP1, Windows 7, Windows Server 2008 и Windows Server 2008 R2. Для получения инструкций по настройке IIS 5.1 и IIS 6.0 на Windows XP и Windows Server 2003 перейдите на страницу Microsoft IIS 5.1 и IIS 6.0.
Включение поддержки FastCGI в IIS
Модуль FastCGI при установке IIS по умолчанию отключён. Способы включения его различаются в зависимости от версии используемой Windows.
Для включения поддержки FastCGI на Windows Vista SP1 и Windows 7:
-
В меню "Пуск" выберите пункт "Выполнить", в появившемся окне введите с клавиатуры "optionalfeatures.exe" и нажмите "Ok";
-
В открывшемся окне "Компоненты Windows" раскройте папку "Службы IIS", "Службы интернета", "Компоненты разработки приложений" и установите галочку напротив "CGI";
-
Нажмите OK и ждите окончания процесса установки.
Чтобы включить поддержку FastCGI на Windows Server 2008 и Windows Server 2008 R2:
-
В Windows откройте меню Пуск выберите пункт "Выполнить:", наберите с клавиатуры "CompMgmtLauncher" и нажмите "Ok";
-
Если роль "Веб-сервер (IIS)" не представлена во вкладке "Роли", добавьте её, выбрав "Добавить роли";
-
Если роль "Веб-сервер (IIS)" присутствует, выберите "Выбор службы ролей" и установите галочку напротив "CGI" в группе "Компоненты разработки приложений";
-
Нажмите "Далее" затем "Установить" и ждите окончания процесса установки.
Настройка IIS для обработки PHP запросов
Скачайте и установите PHP в соответствии с инструкциями, приведёнными в описании установки
Замечание:
При использовании IIS рекомендуется использовать потоко-небезопасную (Non-thread-safe) сборку PHP, которая доступна по ссылке » PHP для Windows: Установочные файлы и исходный код.
Измените CGI и FastCGI настройки в файле php.ini как показано ниже:
Пример #1 CGI и FastCGI настройки в php.ini
fastcgi.impersonate = 1 fastcgi.logging = 0 cgi.fix_pathinfo=1 cgi.force_redirect = 0
Настройте IIS обработчик для PHP, используя Интерфейс управления IIS или через командную строку.
Использование Интерфейса управления IIS для создания обработчика PHP
Следующие шаги позволят вам создать IIS обработчик для PHP в Интерфейсе управления IIS:
-
В Windows меню Пуск выберите команду "Выполнить:", введите в клавиатуры команду "inetmgr" и нажмите "Ok";
-
В Интерфейсе управления IIS выберите сервер в дереве "Подключения";
-
На "Начальной странице" откройте "Сопоставления обработчиков";
-
На вкладке "Действия" выберите "Добавить сопоставление модуля...";
-
В окне "Добавление сопоставления модуля" введите следующее:
- Путь запроса: *.php
- Модуль: FastCgiModule
- Исполняемый файл: C:\[Path to PHP installation]\php-cgi.exe
- Имя: PHP_via_FastCGI
-
Нажмите кнопку "Огараничения запроса" и сконфигурируйте сопоставление вызывать обработчик только при сопоставлении с файлом или каталогом;
-
Нажмите OK во всех диалогах для сохранения конфигурации.
Использование командной строки для создания сопоставления обработчика PHP
Используйте команды приведённые ниже для создания пула процессов IIS FastCGI который будет использовать php-cgi.exe выполняемый для PHP запросов. Замените значение параметра fullPath на абсолютный путь к файлу php-cgi.exe.
Пример #2 Создание IIS FastCGI пула процессов
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI ^ /+[fullPath='c:\PHP\php-cgi.exe']
Настройка IIS для обработки специфических запросов PHP из командной строки показана ниже. Замените значение параметра scriptProcessor на абсолютный путь к файлу php-cgi.exe.
Пример #3 Создание сопоставления обработчика запросов PHP
%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers ^ /+[name='PHP_via_FastCGI', path='*.php',verb='*',modules='FastCgiModule',^ scriptProcessor='c:\PHP\php-cgi.exe',resourceType='Either']
Эта команда создает для IIS сопоставление обработчика для файлов с расширением *.php, который получается в результате и обрабатывается модулем FastCGI.
Замечание:
На этом шаге установка и настройка завершены. Следующие инструкции необязательны, но очень рекомендуются для достижения оптимальной функциональности и производительности PHP на IIS.
Представление и доступ к файловой системе
При использовании IIS рекомендуется включить представление FastCGI в PHP. Это контролируется директивой fastcgi.impersonate в php.ini файле. Когда имперсонация включена, PHP будет выполнять все операции с файловой системой под аккаунтом, который был определён при аутентификации IIS. Это гарантирует, что при общем PHP процессе для всех сайтов IIS, PHP скрипты этих сайтов не будут иметь доступ к файлам друг друга до тех пор, пока IIS использует различные учетные записи для каждого из сайтов.
Для примера, в настройках по умолчанию IIS 7, включена анонимная аутентификация под стандартным пользователем IUSR. Это значит, что давая разрешение IIS выполнить PHP скрипт, так же необходимо дать права на чтение этого скрипта аккаунту IUSR. Если PHP приложению необходимо выполнить запись в некоторые файлы или папки, тогда аккаунту IUSR следует дать права на запись в них.
Чтобы решить какой пользователь используется для идентификации в IIS 7, можно использовать следующие команды. Замените "Default Web Site" на имя IIS сайта, с которым вы работаете. На выходе, в XML конфигурации смотрите атрибут userName.
Пример #4 определение аккаунта, используемого IIS при анонимной идентификации
%windir%\system32\inetsrv\appcmd.exe list config "Default Web Site" ^ /section:anonymousAuthentication <system.webServer> <security> <authentication> <anonymousAuthentication enabled="true" userName="IUSR" /> </authentication> </security> </system.webServer>
Замечание:
Если атрибут userName отсутствует в элементе anonymousAuthentication, или установлен как пустая строка, это значит, что удостоверение пула приложений используется как анонимное для этого веб-сайта.
Для изменения настроек доступа для файлов или папок, используйте интерфейс пользователя в профоднике Windows или команду icacls.
Пример #5 Настройка разрешения доступа к файлам
icacls C:\inetpub\wwwroot\upload /grant IUSR:(OI)(CI)(M)
Установка index.php как документ по умолчанию в IIS
По умолчанию в IIS не установлено имя документа для обработки HTTP запросов по умолчанию. В PHP приложениях, обычно используется по умолчанию документ index.php. Чтобы добавить index.php в лист документов по умолчанию IIS, используйте такую команду:
Пример #6 Установка index.php как документ по умолчанию в IIS
%windir%\system32\inetsrv\appcmd.exe set config ^ -section:system.webServer/defaultDocument /+"files.[value='index.php']" ^ /commit:apphost
FastCGI и PHP удаление конфигурации
Настройка IIS FastCGI установок для утилизации PHP процессов с помощью команд приведена ниже. Оция FastCGI instanceMaxRequests устанавливает максимальное количество запросов, которое может обрабатываться одним php-cgi.exe процессом пока IIS не начнет их отключать. PHP переменная окружения PHP_FCGI_MAX_REQUESTS устанавливает как много запросов будет обрабатывать один php-cgi.exe процесс пока сам не начнет удалять их. Конечно, значение установленное для FastCGI InstanceMaxRequests меньше или равно PHP_FCGI_MAX_REQUESTS.
Пример #7 Настройка FastCGI и PHP утилизации
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='c:\php\php-cgi.exe'].instanceMaxRequests:10000 %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.^ [name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Установка таймаута FastCGI
Увеличение параметра таймаута для FastCGI делается, если имеется долго выполняемый PHP скрипт. Два параметра контролируют таймаут, это: activityTimeout и requestTimeout. Используйте команды приведённые ниже для изменения настроек таймаута. Конечно, надо заменить значение параметра fullPath на полный путь к файлу php-cgi.exe.
Пример #8 Конфигурация установок таймаута FastCGI
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].activityTimeout:"90" /commit:apphost %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^ /[fullPath='C:\php\php-cgi.exe',arguments=''].requestTimeout:"90" /commit:apphost
Изменение положения файла php.ini
PHP ищет файл php.ini некоторых метах и это даёт нам возможность изменить местоположения по умолчанию файла php.ini, используя переменную окружения PHPRC. Чтобы указать PHP загружать конфигурационный файл из определённого места используйте команды, приведённые ниже. Абсолютный путь до дирректории где лежит файл php.ini определяется как значение переменной окружения PHPRC.
Пример #9 Изменение положения файла php.ini
appcmd.exe set config -section:system.webServer/fastCgi ^ /+"[fullPath='C:\php\php.exe',arguments=''].environmentVariables.^ [name='PHPRC',value='C:\Some\Directory\']" /commit:apphost
Коментарии
Example #9 fails unless I change "php.exe" to "php-cgi.exe" as follows:
appcmd.exe set config -section:system.webServer/fastCgi ^
/+"[fullPath='C:\php\php-cgi.exe',arguments=''].environmentVariables.^
[name='PHPRC',value='C:\PHP\']" /commit:apphost
If you get an error running the second command in Example 7 try this instead:
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='C:\php\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Be sure to change the path to the php-cgi.exe file if it is not at C:\php\.
Good luck.
To resolve the error "The FastCGI process exited unexpectedly" install the below package:
To fix it I had to install the Visual C++ Redistributable for Visual Studio 2012 Update 3
http://www.microsoft.com/en-us/download/confirmation.aspx?id=30679
It's a bit silly, but it's worth writing it down, as there will be a day you'll have to configure php on IIS in a Preproduction via VPN with a really pushing customer and only few minutes available... and somehow you WILL forget this.
Php.ini by default has the short code set to off, so if you configure everything and test it out with <? phpinfo() ?> you will a blank screen with the code in the source, which can also indicate that there is something wrong in the configuration and that the script doesn't get sent to the php processor. It's not, it's correct! Just test out with <?php phpinfo(); ?> or turn on the short codes!
This might be an incredibly stupid comment, but I thought I would share anyway. If you want to install PHP on Windows Server in one click without all the hassle above, simply go here to the official IIS website:
http://php.iis.net
Run the install, boom, PHP works on your IIS/Windows server! No command prompt windows, no messing with settings, everything is pre-configured. I followed all the steps on this page and I could not get PHP working for anything. When I was about to give up, I found that link where the official Microsoft installer made it stupidly easy.
Use it, save your time and get back to work faster.
I want to share the solution to a problem I wasted a couple of hours on:
I have some scripts that run for several minutes, they calculate lots of things. I got an error 500. The reason is not the PHP-time-limit, but the timeout of the IIS-FastCGI-setting. Unfortunately I have the German version, I guess the setting translates to "activity timeout" and "request timeout". Just increase the values.
And a 2nd problem: When one of those scripts was running, the server would refuse to process other "quick" scrips at the same time. So normal users would have to wait MINUTES just because a kind of admin-user is running the long script. There is another setting for FastCGI: max number of instances (again, translated!). The setting was 0, which means that IIS decides automatically. Obviously, that was a bad idea. I set it to 4 and now everything is fine.
I hope that helps someone. It may sound obvious, but coming from an old ISAPI-installation, those problems where rather new to me.