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:

  1. В меню "Пуск" выберите пункт "Выполнить", в появившемся окне введите с клавиатуры "optionalfeatures.exe" и нажмите "Ok";

  2. В открывшемся окне "Компоненты Windows" раскройте папку "Службы IIS", "Службы интернета", "Компоненты разработки приложений" и установите галочку напротив "CGI";

  3. Нажмите OK и ждите окончания процесса установки.

Включение поддержки FastCGI для IIS7 на Windows Vista SP1 и Windows 7

Чтобы включить поддержку FastCGI на Windows Server 2008 и Windows Server 2008 R2:

  1. В Windows откройте меню Пуск выберите пункт "Выполнить:", наберите с клавиатуры "CompMgmtLauncher" и нажмите "Ok";

  2. Если роль "Веб-сервер (IIS)" не представлена во вкладке "Роли", добавьте её, выбрав "Добавить роли";

  3. Если роль "Веб-сервер (IIS)" присутствует, выберите "Выбор службы ролей" и установите галочку напротив "CGI" в группе "Компоненты разработки приложений";

  4. Нажмите "Далее" затем "Установить" и ждите окончания процесса установки.

Включение поддержки FastCGI на Windows Server 2008 и Windows Server 2008 R2

Настройка 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:

  1. В Windows меню Пуск выберите команду "Выполнить:", введите в клавиатуры команду "inetmgr" и нажмите "Ok";

  2. В Интерфейсе управления IIS выберите сервер в дереве "Подключения";

  3. На "Начальной странице" откройте "Сопоставления обработчиков";

    Создание IIS обработчика для PHP : нахождение сопоставителя обработчиков

  4. На вкладке "Действия" выберите "Добавить сопоставление модуля...";

  5. В окне "Добавление сопоставления модуля" введите следующее:

    • Путь запроса: *.php
    • Модуль: FastCgiModule
    • Исполняемый файл: C:\[Path to PHP installation]\php-cgi.exe
    • Имя: PHP_via_FastCGI

  6. Нажмите кнопку "Огараничения запроса" и сконфигурируйте сопоставление вызывать обработчик только при сопоставлении с файлом или каталогом;

  7. Нажмите OK во всех диалогах для сохранения конфигурации.

Создание IIS сопоставления обработчика для PHP : Добавление сопоставления обработчика

Использование командной строки для создания сопоставления обработчика 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

Коментарии

When installing PHP in Windows 2008 Server R2, you might find that Windows IIS 7 returns error code 500 when executing scripts.  To resolve this do two things:

1) browse to the folder that contains the script with the error using CMD.  Yes, this is the command prompt.

Then execute the script using something like: "C:\Program Files\PHP\PHP5.4\php.exe" [script-filename].php

Note that the quotes ("") are needed for file paths with spaces.

This will return the results of the script and any errors you might have.

2) To have IIS 7 return the errors to your webbrowser, turn off error logging and turn on display errors. And to make sure that all the errors are display, set error reporting to ALL.

log_errors = Off
display_errors = On
error_reporting = E_ALL
2012-06-01 18:19:38
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Автор:
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
2012-06-07 09:30:34
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
For setting the time out above it took me forever to figure out the right combination for double and single quotes (and no quotes) given I had spaces in the absolute path to my php-cgi.exe file. Here is what worked in case you have/had the same problem:
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath="'C:\Program Files (x86)\PHP\php-cgi.exe'"].activityTimeout:90 /commit:apphost

%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi ^
/[fullPath="'C:\Program Files (x86)\PHP\php-cgi.exe'"].requestTimeout:90  /commit:apphost
2012-08-17 05:21:49
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
CgiModule may be better than FastCgiModule in development because CGI processes are not cached.
2013-05-11 07:41:11
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
In CGI and FastCGI settings in php.ini exaple, add:
extension_dir = 'ext'
2013-07-11 18:57:21
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Автор:
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.
2013-08-21 03:24:12
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Автор:
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
2013-10-09 23:21:54
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Following the installation steps second line of Example #3 resulted in an error:

ERROR ( message:Cannot find SITE object with identifier "path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='(path-to-PHP)\php-cgi.exe',resourceType='Either']". )

Apparently there is an extra space before the ,path='*.php' that must be removed.
Thanks
2014-03-04 17:58:39
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Excellent notes the last comment about adding the environment variables works as previously stated for both examples. I had to figure it out before reading these comments... 

and yes the correct format would be 

%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']"

and for the second one

%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/FastCGI  ^ /+"[fullPath='c:\PHP\php-cgi.exe'].environmentVariables.[name='PHPRC',value='c:\PHP\']"

hope this helped!
2014-04-08 00:36:53
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
I ran into the Error 500 with PHP 5.5 and Server 2008 R2 x64.  The issue was that I installed the 64-bit version of Visual C++ Redistributable 2012 and not the 32-bit version.
2014-04-14 21:30:31
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
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!
2014-09-11 11:42:29
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
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.
2015-02-01 01:19:12
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Автор:
Microsoft Web Platform Installer for php MySQL and others:
http://www.microsoft.com/web/downloads/platform.aspx
2015-06-17 18:35:28
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
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.
2015-12-22 11:25:51
http://php5.kiev.ua/manual/ru/install.windows.iis7.html
Автор:
Point 6 says: "Click "Request Restrictions" button and then configure the mapping to invoke handler only if request is mapped to a file or a folder"

When should you select each one? What are the consequences?

What happens if you select "file" or "folder" instead of "file or folder"?

There should be an explanation of what each of those three options means and when you should select each one. 

Are there any security risks linked to selecting "file or folder"?
2017-10-30 12:08:14
http://php5.kiev.ua/manual/ru/install.windows.iis7.html

    Поддержать сайт на родительском проекте КГБ