Статьи

Повторите это с PHP и IIS

Мы с Марком Брауном на прошлой неделе выступили на ZendCon и поговорили о том, насколько хорошо PHP работает в IIS, и, в частности, о некоторых вещах, которые вы должны сделать, чтобы он действительно хорошо работал на IIS.

Быстрое предупреждение, это, к сожалению, пуля заостренный слайд для меня. Марк создал оригинальную колоду, из которой родился этот доклад, но я отвечаю за его доставку на ZendCon и за размещение здесь.:)

Марк работает в команде веб-платформ и хорошо знает. Он спас мой хвост на этом. Мой голос убивал меня, и он вошел и сделал 80% разговоров. Я говорил через демонстрации, но он затронул все разговорные темы.

Мы начали разговор с небольшой прогулки по переулку памяти. Реальность такова, что многие люди, которые пробовали PHP на Windows и действительно не любили его, делали это на предыдущей версии IIS под CGI. Проблема заключалась в том, что PHP в более старой версии IIS со старым школьным обработчиком CGI Только в 2007 году, когда вышел FastCGI, все стало интересным в стеке IIS.

IIS 7 вышел, начиная с Win7 и SQL Server 2008. Он претерпел огромные изменения не только с точки зрения PHP, но и с точки зрения всей его архитектуры. Начнем с того, что поверхность атаки значительно уменьшена, поскольку она делает очень легкую установку, а затем вам нужно включить все, что вы хотите запустить. Из коробки он обслуживает только статические файлы, и вам нужно включить ASP.NET, PHP и все остальное.

Новая модульная архитектура просто фантастическая. Раньше вам приходилось писать любые расширения или модули на C ++ или, по крайней мере, создавать оболочку C ++ вокруг управляемого кода. Теперь вы можете написать свои модули в .NET и загрузить их напрямую. Эти модули могут подключаться к любой точке конвейера обработки и выполнять любые действия — от обработки аутентификации до манипулирования входящими или исходящими потоками.

Кроме того, конфигурация для каждого приложения стала чрезвычайно мощной и может делать все, что угодно, от настройки обработки кэша до правил перезаписи URL (подробнее об этом чуть ниже) до настройки модулей и обработчиков, которые могут подключаться к конвейеру обработки IIS.

Еще одно замечательное улучшение — FastCGI. Если вы делаете PHP на IIS, вам нужно использовать FastCGI. Это обработчик CGI в IIS 7 и доступен для загрузки для IIS 6. Были внесены некоторые действительно фундаментальные изменения. Одним из них является то, что в рамках CGI IIS запускает новый процесс для каждого запроса. Это действительно дорогая вещь. Под FastCGI он делает некоторые удивительные вещи, когда он раскручивает настраиваемое количество процессов, а затем перезапускает те же самые процессы снова и снова. Здесь есть масса других замечательных улучшений, в том числе переработка пула PHP при изменении php.ini, поэтому вам не нужно вручную перезагружать IIS и многое другое.

WinCache не устанавливается по умолчанию на некоторых экземплярах IIS, но вы должны убедиться, что это так. Он распространяется через Pecl по адресу http://pecl.php.net/package/WinCache . Он предоставляет массу замечательных улучшений, в том числе кэш кода операции, кэш файла, кэш относительного пути файла, кэш сеанса и кэш данных пользователя. Замечательная часть заключается в том, что все, что вам нужно сделать, чтобы воспользоваться преимуществами первых трех, — это включить WinCache в вашем файле PHP.ini. Просто выполнение этого показало увеличение производительности от 100% до 400% в зависимости от приложения и того, что оно делает.

Чтобы воспользоваться преимуществами пользовательского кэша данных, вам нужно написать немного кода, но все функции имеют ту же сигнатуру функции, что и APC. Посмотрите на пример кода, который должен был быть написан для поддержки Joomla для WinCache .

После того, как вы его установили, есть отличный скрипт, который поможет вам показать, что находится в WinCache в любой момент — подробности на http://blogs.iis.net/donraman/archive/2009/10/20/wincache-1 -0-гс-используя-на-статистика-page.aspx

URL Rewrite — очень мощный механизм перезаписи для IIS 7, поэтому вам больше не нужно смотреть на внешние механизмы перезаписи, такие как ISAPI Rewrite. Помните, что он не устанавливается по умолчанию, поскольку IIS 7 устанавливается с наименьшим возможным набором функций. Если вы сейчас являетесь пользователем Apache, самый простой способ начать это — просто импортировать ваш файл .htaccess, и он извлечет и преобразует ваши правила в файл web.config, который использует IIS 7.

Один быстрый пример — тот, который я использую для WordPress, чтобы включить красивые URL.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webserver>
<rewrite>
<rules>
<rule name="wordpress" patternsyntax="Wildcard">
<match url="*" />
<conditions>
<add negate="true"
input="{REQUEST_FILENAME}" matchtype="IsFile" />
<add negate="true"
input="{REQUEST_FILENAME}" matchtype="IsDirectory" />
</conditions>
<action url="index.php" type="Rewrite" />
</rule>
</rules>
</rewrite>
</system.webserver>
</configuration>

But it can do much more than just dealing with simple redirection. It can match on wildcards, regular expressions and a ton more.

Another way to squeeze some performance out of PHP on Windows is to migrate to PHP 5.3. The builds of PHP 5.2 and previous for Windows are built with VC6 which is a 10 year old compiler. The new PHP 5.3 builds are built with VC9 which is a modern compiler with a lot of great optimizations. In addition, earlier versions of PHP on Windows did almost everything through a POSIX translation layer just to get it to work. The Windows support in PHP 5.3 has been rewritten to run natively on the Win32 APIs rather than having to go through the translation layer.

Now, if you really need to check out building your own Performance Guided Optimization build of PHP specifically for your box.


The next thing look at is the new PHP Manager released on CodePlex. The very short version is that it allows you to run different versions of PHP on the same server for different applications. It manages  the php.ini file and PHP extensions per application as well. You can even connect to it remotely through the IIS Remote Administration Tool so you no longer have to have write permissions on the PHP directory on the box to manage things.

Connecting to SQL Server has been a pain point as well for many years. In 2008, however, the SQL Server team released the new native drivers for PHP on Windows. Then this year (2010 for those those that are reading this later… :) ), the SQL Server team released PDO support for PHP on Windows. Drupal 7 is actually already tested against this and ready to go.

The question was raised about when we’ll have Linux drivers for SQL Server and I’ll give the same answer here that I gave on stage. The SQL Server team has received that feedback and it’s on the radar. I don’t have any insight into the SQL Server team’s roadmaps or future plans and I have no idea if it will ever happen or when it would happen if it were on a roadmap somewhere but I do know that the SQL Server team has heard that request from multiple sources and they listen to their community. Is that non-answer enough for you? :)

Another really useful utility is the IIS Database Manager. The easiest way to install this is through the Web Platform Installer. This plugin to IIS Manager helps you manage your databases whether they are SQL Server or MySql. It actually looks in your web.config file for connection strings and will show those databases in the «quick open» area or you can browse to your database and open it specifically. This is not going to replace your favorite DBA tool but it will give you quick and easy access to do simple things remotely without having to crack open extra ports and all that.

Many of the most popular PHP apps out there run really well on IIS and are easily installed through the Web Application Gallery and the Web Platform Installer.

But don’t stop there, you can check out all of the applications in the app gallery until you find the ones that make the most sense for you.

In addition to all the work on the core language and getting it to run really well, Microsoft’s been working hard at making things like SQL Server reporting services work with the SQL Server Reporting Services SDK for PHP. PHP works really well with Silverlight as Silverlight does a great job with restful services as well as having the best video experience out there through the adaptive streaming technology. I was talking to a PHP developer at ZendCon who does a lot of video and his shop used to have to buy 5 or 6 different bit rate videos to cover the different bit rates that their clients needed and they had to store all of that video somewhere. Now with Silverlight, they buy one video and store one video and all of their clients are shown the correct bit rate for their connection.

We’ve been doing a ton with the PHP community. Many of the things that we talked about in this talk are out there at open source.

I’m not going to drain the list but most of the work by the Interoperability Bridges team is released as open source.

We listen and interact on the PHP forums. Many of us can be found on IRC. We work with core team members from PHP and many of the top applications to help decide what are our next features, products and more. It’s been a really exciting ride the last 3-5 years here at Microsoft in the PHP and open source space.

The quickest and easiest way to get started with PHP on IIS is through the Web Platform Installer. This wizard style installer will let you pick an application and not only install that application but it will determine what the dependencies are for it, configure your web platform and install all of those dependencies. And it’s language neutral installing both ASP.NET and PHP applications easily.

In summary, PHP on IIS has come a long way in 5 years. It’s a viable choice not only for development but for production. Performance, stability, configurability and more have all improved dramatically through technologies such as FastCGI, WinCache, SQL Server and very importantly IIS 7. Check it out. I think you’ll be pleasantly surprised.

The quickest and easiest way to check it out is through the Web Application Gallery.

Check it out and let me know what you think.