PHP на Windows и IIS

Материал из system.c
Перейти к навигации Перейти к поиску

Авторская статья

На PHP написано много хороших приложений. Даже нет, очень много и некоторые из них очень хорошие, так почему бы не использовать эти приложения на Windows? Особенно, если внутренний портал работает на Windows, а на Unix машине крутиться внешний сайт компании — тогда можно сэкономить на инфраструктуре и разместить на Windows сервере еще и внешний сайт. Либо, если есть желание стандартизировать инфраструктуру и размещать сайты на Windows платформе, поскольку разработчики и пользователи работают на Windows платформе. На сайте [www.iis.net www.iis.net] можно найти список популярных PHP приложений с инструкциями по установке на IIS. Для их запуска на IIS не требуется изменения PHP кода.

Установка и настройка PHP для использования с модулем FastCGI.

Для начала, чтобы успешно использовать PHP на Windows, неплохо было бы PHP установить.

Шаг 1. Скачать PHP

На сайте PHP.net нужно скачать последную версию PHP для Windows. Для использования с FastCGI рекомендуется устанавливать версию PHP без контроля безопасности потоков, поскольку сам модуль FastCGI гарантирует, что выполнение происходит в одном потоке и поддержка контроля безопасности потоков в самом PHP привносит лишние проверки и блокировки, приводящие к значительному падению производительности. Поэтому выбираем Non-thread-safe Win32 binaries (версия 5.2.6 актуальна на момент написания этого сообщения). Стоит отметить, что веряим Non-thread-safe была разработана специально для работы с FastCGI на IIS (первый релиз был в версии 5.2.1) и использовать в других средах не рекомендуется. Кстати, начиная с версии 5.2.2 Zend серьезно работает над оптимизацией производительности PHP под Windows, что не может не радовать. Если сравнить версии 5.2.1 и 5.2.2, то разницу в скорости обработки запросов можно легко увидеть с помощью простого нагрузочного теста.

Шаг 2. Установка PHP

Установка осуществляется совсем просто: поскольку мы скачали архив с исполнимыми файлами, достаточно развернуть этот архив, например, в директорию C:\Web\PHP. В качестве базовой конфигурации воспользуемся рекомендованными установками: cделаем копию файла php.ini-recommended в php.ini в этой же директории и откроем его для редактирования, после чего пройдем файл сверху расскоментируя следующие строки, дабы обеспечить безопасность и совместимость с большинством PHP приложений:

   open_basedir = директория, где размещены PHP приложения.
   Указание директории ограничит права доступа к файлам PHP приложений только
   этой директорией. Удобно переопределять эту настройку в файлах конфиграции
   непосредственно для каждого приложения, однако не помешает установить эту
   настройку и указать корневую директорию всех PHP приложений. Например, C:\inetpub\PhpSites.
   cgi.force_redirect = 0
   По умолчанию установлено 1, но необходимо установить в 0, поскольку IIS
   контролирует безопасность выполнения PHP и в этой настройке нет
   необходимости. Более того, включение может привести к неожиданным
   результатам. При использовании с другими web-серверами на Windows эту
   настройку необходимо включить.
   cgi.fix_pathinfo = 1
   PHP будет устанавливать имя файла в переменной SCRIPT_FILENAME, если
   установить значение 0, то имя файла будет в переменной PATH_TRANSLATED, что
   может нарушить совместимость с большинством приложений.
   fastcgi.impersonate = 1;
   FastCGI позволяет процессу имперсонироваться используя контекст клиента,
   вызывающего процесс. Этот механизм работает только под FastCGI/IIS, например
   на Apache на Windows это работать не будет.
   short_open_tag = On
   Большинство приложений используют короткие теги <? ?>, поэтому будет не
   лишним включить их поддержку.
   display_errors = On
   На время проверки и отладки PHP приложений на FastCGI стоит включить вывод
   сообщений об ошибках.


Шаг 3. Проверка работоспособности PHP

Пока мы не сконфигурировали IIS, проверить работоспособность интерпретатора можно просто, например, выполнив команду

   c:\web\php\php.exe -info > c:\test.txt

Установка и настройка модуля FastCGI на IIS7.

Если у вас у IIS7, то что-то мне подсказывает о названии вашей операционной системы — Windows Vista? Не угадал, тогда Windows Server 2008! Либо вы хакер и поставили IIS7 еще-куда-то, но это нестандартное решение и мы его не поддерживаем ;).

Шаг 1. Установка FastCGI

Хочу обрадовать сразу — в IIS7, идущем с Windows Server 2008 и Windows Vista Service Pack 1 модуль FastCGI уже включен. Его необходимо лишь подключить в настройках. Для этого на Vista нужно открыть Control Panel -> Programs и выбрать «Turn Windows Features On or Off»:

PHP IIS Prog-N-Comp.png

После этого необходимо установить фичу в IIS: Internet Information Services -> World Wide Web Services -> Application Development Features -> CGI. При этом будет установлена поддержка и CGI и FastCGI.

PHP IIS On-Off.png

На Windows Server 2008 процесс аналогичен: Server Manager -> Roles -> Add Role Services -> Web Server -> Application Development -> CGI. Собственно все, что требуется для включения модуля FastCGI.

Шаг 2. Конфигурация IIS7

1. Открыть IIS Manager, выбрать узел (сервер) для которого нужно настроить поддержку PHP. И далее выбрать Handler Mappings.

PHP IIS HandleMappers.png
PHP IIS AddModule.png

2. Выбираем на странице Handler Mappings ссылку Add Module Mapping и заполняем окно следующими значениями:

   Request path: *.php (обработка всех файлов с расширением .php)
   Module: FastCgiModule (модуль FastCGI)
   Executable: C:\Web\PHP\php-cgi.exe (путь к PHP)
   Name: PHP (имя для удобства)
PHP IIS Module.png

После добавления этой настройки появится окно с вопросом о регистрации FastCGI приложения для этого обработчика. Подтверждаем. Описанные выше действия привели к созданию в директории PhpSites следующего web.config файла:

   <?xml version=«1.0» encoding=«UTF-8»?>
       <configuration>
           <system.webServer>
               <handlers>
                   <add name=«PHP» path="*.php" verb="*"
                       modules=«FastCgiModule» scriptProcessor="C:\Web\PHP\php-cgi.exe"
                       resourceType=«Unspecified» />
               </handlers>
           </system.webServer>
       </configuration>
   * This source code was highlighted with Source Code Highlighter.

Теперь можно переходить к проверке работоспособности PHP.

Шаг 3. Проверяем корректность настройки

В директории узла для которого мы сконфигурировали PHP создаем файл index.php:

   <?
   phpinfo();
   ?>

И обращаемся к этому файлу через HTTP запрос. В результате, если все хорошо и наша карма не испорчена, запрос будет корректно обработан:

PHP IIS PHPinfo.png

Рекомендации по настройке PHP на IIS7

Разумеется, при использовании PHP на IIS7 могут возникать подводные камни, с которыми нужно бороться, чтобы достичь ожидаемого результата (замечательной работы PHP приложений на Windows). Молотки для разбивания часто встречающихся камней приведены ниже.

Частота перезапуска процессов PHP

Поскольку при использовании PHP на IIS7 с использованием FastCGI модуля, сам модуль FastCGI берет на себя управление процессами и ресурсами, необходимо убедится, что механизм перезапуска процессов (recycling) в PHP не будет мешать FastCGI. Это легко сделать, если настроить FastCGI так, чтобы он всегда перезапускал процессы раньше, чем это сделает PHP. В настройках FastCGI существует настройка instanceMaxRequests, определяющая после обработки какого количества запросов, процесс будет перезапущен. В PHP аналогичный параметр задается значением переменной PHP_FCGI_MAX_REQUESTS. Очевидно, чтобы дать возможность FastCGI рулить процессом, достаточно установить instanceMaxRequests <= PHP_FCGI_MAX_REQUEST. Это удобно сделать, отредактировав файл applicationHost.config (прячется в директории C:\windows\system32\inetsrv\config\). В конфигурации должна быть следующая информация:

   <fastCgi>
       <application fullPath="C:\inetpub\php\php-cgi.exe"
           maxInstances=«4» instanceMaxRequests=«10000»>
       <environmentVariables>
       <environmentVariable name=«PHP_FCGI_MAX_REQUESTS» value=«10000»>
       </environmentVariables>
       </application>
   </fastCgi>
   * This source code was highlighted with Source Code Highlighter.
Использование нескольких версий PHP

Поскольку разные версии PHP могут использоваться в приложениях, которые размещаются на сервере, то хорошо бы было дать возможность использовать разные версии для разных сайтов. В файле конфигурации applicationHost.config достаточно определить секции для разных версий PHP:

   <fastCgi>
       <application fullPath=«C:\inetpub\php\php-cgi.exe»>
          ...
       </application>
       <application fullPath=«C:\inetpub\php4\php4.exe»>
          ...
       </application>
       <application fullPath=«C:\inetpub\php41\php41.exe»>
          ...
       </application>
   </fastCgi>
   * This source code was highlighted with Source Code Highlighter.

А уже для каждого из сайтов конфигурируется модуль, использующий ту или иную версию (можно использовать интерфейс, который описан выше, а можно отредактировать конфигурацию в тексте):

   <handlers>
       <add name=«PHP4» path="*.php" verb="*" modules=«FastCgiModule»
           scriptProcessor="C:\inetpub\php\php41.exe"
           resourceType=«Unspecified» />
   </handlers>
   * This source code was highlighted with Source Code Highlighter.
Использование разных наборов настроек PHP

Если есть желание настраивать PHP по-разному для разных сайтов, то опять же все это можно описать через настройки конфигурации в applicationHost.config.

   <fastCgi>
      <application fullPath="C:\inetpub\php\php-cgi.exe"
         arguments="-d my.website=wordpress">
        <environmentVariables>
          <environmentVariable name=«PHPRC» value=«C:\inetpub\wordpress» />
        </environmentVariables>
      </application>
      <application fullPath="C:\inetpub\php\php-cgi.exe"
         arguments="-d my.website=phpsite">
        <environmentVariables>
          <environmentVariable name=«PHPRC» value=«C:\inetpub\phpsite» />
        </environmentVariables>
      </application>
    </fastCgi>
    * This source code was highlighted with Source Code Highlighter.

После этого, настройки связываются с соответствующими сайтами в web.config:

   <system.webServer>
      <handlers accessPolicy=«Read, Script»>
        <add name=«PHP» path="*.php" verb="*" modules=«FastCgiModule»
         scriptProcessor="C:\inetpub\php\php-cgi.exe|-d my.website=wordpress"
          resourceType=«Unspecified» requireAccess=«Script» />
      </handlers>
    </system.webServer>
    * This source code was highlighted with Source Code Highlighter.

В соответствии с приведенной конфигурацией, php.ini нужно разместить в директории каждого из сайтов. При редактировании настроек, стоит строго соблюдать совпадение путей к соответствующей версии PHP и с applicationHost.config и в web.config, чтобы избежать неожиданных результатов, если пути будут перепутаны. На первый взгляд редактирование конфигурации может показаться сложным и неудобным процессом, но как только вы привыкните к конфигурации в XML и распространению настроек методом Ctrl+C, Ctrl+V, вы будете удивляться наличию других способов конфигурации :)

Настройки безопасности PHP

В php.ini мноо разных настроек, многие из которых влияют на безопасность использования PHP. Настроить все подходящим образом, достойное дело.

   Set allow_url_fopen=Off      ; использование URL для операций с файлами
   Set allow_url_include=Off
   register_globals=Off         ; отмена регистрации глобальных переменных
   open_basedir=«c:\inetpub\»   ;ограничение на директорию, в которой работает PHP
   max_execution_time=30        ; ограничение времени выполнения скриптов
   max_input_time=60
   memory_limit=16M             ;ограничение на размер используемой памяти
   upload_max_filesize=2M
   post_max_size=8M
   max_input_nesting_levels=64
   display_errors=Off           ; отключение сообщений об ошибках
   log_errors=On
   error_log=«C:\error.log»
   expose_php=Off               ; скрыть присутствие PHP

Заключение

PHP на Windows — это не просто интересно и удобно, главное, что это работает. А команда IIS работает над тем, чтобы PHP работал на Windows не хуже, чем на Unix/Linux (конечно, стараются сделать лучше). Поскольку это новая тема для Microsoft, то мы можем сделать какие-то ошибки, можем чего-то не замечать и не понимать, поэтому нам очень важно получать комментарии от вас — разработчиков и администраторов. Пишите в комментариях ваши пожелания и проблемы, которые вы видите сейчас в PHP на Windows, а мы будем стараться проблемы решать, а пожелания реализовывать.