Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

IIS 7 pro PHPčkáře

Jednou z novinek Internet Information Server 7.0 je modul FastCGI vyvinutý ve spolupráci se společností Zend, který je určen pro plnohodnotný běh PHP aplikací na Windows Server 2008. Tento modul lze doinstalovat i do IIS 6.0 ve Windows Server 2003. Proč ale provozovat PHP aplikace na Windows Server, když je tu Linux?

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Začneme asi tím, na co se většina PHP programátorů zeptá hned na začátku: Proč Windows Server 2008 a IIS 7, když je tu Linux a Apache, navíc zadarmo. Odpověď bude, pro někoho možná překvapivě, netechnická.

Situace 1

Jste malá firma, která poskytuje služby spojené s některou z existujících PHP aplikací. Osloví vás potenciální zákazník, který chce začít provozovat firemní blog. Vy nabídnete Drupal a firma, která stojí s nabídkou proti vám, nabídne Dotnetnuke (běžící na ASP.NET).

Pro koho se asi rozhodne zákazník, pokud má jeden jediný server, na kterém provozuje Windows Server 2008? Pořídí si další HW a konektivitu pro Linux server a bude vám, kromě správy a úprav aplikace Drupal, ještě platit za správu Linuxového serveru, pro kterého nemá správce, nebo si raději vybere konkurenci, které bude platit jen za správu a úpravy aplikace Dotnetnuke, protože běží na IIS?

Situace 2

Chcete začít hostovat webové aplikace pro lokální firmy, které si stěžují, že velcí hosteři nejsou schopni reagovat dostatečně flexibilně na jejich požadavky. Omezíte se jen na PHP, když můžete na Windows Server 2008 plnohodnotně hostovat oboje?

Jedna z nejčastějších otázek se týká dostupnosti „mod_rewrite“ pro IIS. Takový modul skutečně existuje, umí importovat pravidla mod_rewrite z Apache, je zadarmo a popíšeme si jej o něco dále. Kromě toho si podobný modul (podstatně jednodušší) zkusíme vytvořit sami.

Zprovoznění podpory PHP na IIS 7

Podpora PHP, tedy modul FastCGI, je standardní součástí IIS 7 na Windows Server 2008 a na Windows Vista SP1. Stačí zapnout podporu CGI pro IIS:

Windows Vista: Start – Ovládací panely – Programy – Zapnout nebo Vypnout funkce systému Windows

Zapnutí PHP na IIS

Windows Server 2008: Povolit roli „Web Server (IIS)“

Zapnutí PHP na IIS

Dále je potřeba stáhnout instalaci PHP z www.php.net. V době psaní tohoto článku se jednalo o verzi 5.2.6 Non-thread-safe pro Win32 a samozřejmě PECL 5.2.6 Non-thread-safe pro Win32. PHP nainstalujete běžným způsobem. Já používám verzi bez instalátoru, kdy PHP jen rozbalím do vybraného adresáře. Další krok je konfigurace FastCGI modulu, aby věděl, kde se nachází PHP. Než si vysvětlíme jak to udělat, je třeba si vysvětlit jak funguje IIS 7 a jak se konfiguruje.

Základy konfigurace IIS 7

IIS 7 sestává z mnoha modulů. Každý z nich se stará o nějakou základní činnost, např. autorizaci uživatele, a vstupuje do hry v různých okamžicích života požadavku klienta, např. před odesláním hlaviček protokolu HTTP, a může být vázán na konkrétní typ souboru, např. modul FastCGI je vázán na soubory s příponou *.php.

Pokud je modul mapován na konkrétní typ souboru, tak se označuje jako handler. Po instalaci IIS 7 máte k dispozici několik desítek modulů, které ale nemusí vaše aplikace používat. Pokud kupříkladu naše aplikace nepoužívá pro přihlašování Windows doménu, je zbytečné mít v ní povolen modul WindowsAuthen­tication.

IIS 7 má globální konfigurační soubor, který obsahuje výchozí nastavení webového serveru a v něm běžících aplikací. Každá aplikace má pak svůj vlastní konfigurační soubor, kterým v podstatě „přepisuje“ výchozí nastavení webového serveru IIS 7. Samozřejmě ne vše je možné měnit na úrovni aplikace.

Konfigurační soubory využívají formát XML, proto je můžete měnit jak ručně pomocí libovolného textového editoru, tak pomocí konzole pro správu IIS 7. Globální konfigurace je uložena v souboru %windir%\system32\inetsrv\config\applicationhost.config (odpovídá httpd.conf pro Apache) a musíte mít administrátorská práva pro jeho editaci. Aplikace pak obsahuje ve svém kořenovém adresáři soubor web.config (obdoba .htaccess pro Apache), který nastavuje konfiguraci pro danou webovou aplikaci.

Spuštění první PHP aplikace pod IIS 7

Už jsme si stručně vysvětlili, jak vypadá konfigurace IIS 7, co jsou to moduly a co jsou to handlery. Můžeme přistoupit ke spuštění první PHP aplikace. V libovolném adresáři si vytvořte PHP soubor, do kterého vložíte oblíbenou funkci pro testování PHP phpinfo(). Do tohoto adresáře musí mít přístup IIS 7.

Další vlastností IIS od verze 6 jsou tzv. Application Pools. Jde o skupinu aplikací, které běží pod stejnou identitou a jsou izolované od ostatních Application Pools. Standardně máte vytvořen DefaultAppPool a Classic .NET AppPool. Oba využívají identitu NetworkService. Pro testování mám připraven adresář, kam má přístup identita Everyone, tím pádem i libovolný Application Pool pod IIS.

Oprávnění v IIS

Nyní přidáme do IIS 7 virtuální adresář směřující na adresář s naším vytvořeným souborem.

  1. Spustíme konzolu pro správu IIS 7.
  2. Přidáme novou aplikaci na náš lokální IIS 7.
    Přidáme aplikaci do IIS
  3. Nastavíme alias a fyzickou cestu k našemu testovacímu adresáři (v našem případě mapujeme alias php na cestu C:\temp\wwwroot\phptest):
    Nastavení aliasu v IIS
  4. Dále musíme přidat podporu PHP. V podstatě musíme připojit modul FastCGI na příponu PHP a nastavit cestu k instalaci PHP. Dvakrát kliknete na ikonu Mapování obslužných rutin a v pravém sloupci vyberete akci Přidat mapování modulů.
    Mapování modulů v IIS
  5. Nyní již stačí otevřít náš testovací PHP skript v prohlížeči:
    Spuštění testovacího skriptu

Když se nyní podíváte do adresáře s PHP skriptem, najdete v něm nový soubor web.config s následujícím obsahem:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="PHP" path="*.php" verb="*" modules="FastCgiModule"
                 scriptProcessor="C:\php\php-cgi.exe" resourceType="Unspecified" />
        </handlers>
    </system.webServer>
</configuration> 

Soubor definuje mapování přípony *.php na modul FastCgiModule. Tento soubor můžete vytvořit i ručně. Není nutné použít konzolu pro správu IIS 7, jako jsme použili před chvílí my.

Jak jsem již psal, není potřeba mít zavedené všechny moduly a handlery, které se nacházejí ve výchozí konfiguraci IIS 7. Vyházení zbytečných modulů a handlerů můžete udělat pomocí konzole pro správu IIS nebo editací web.config. Jaké moduly můžete vyházet závisí na tom, jaké služby IIS 7 (cache, autorizaci, logování, URL rewrite, …) chcete využívat. Tyto služby jsou v podstatě nezávislé na aplikaci.

U handlerů je to jednodušší, protože potřebujete jen handler pro PHP soubory (maska *.php) mapovaný na FastCGI modul a handler pro statické soubory (maska *) mapovaný minimálně na StaticFile modul. Výchozí mapování statických souborů ještě zahrnuje moduly DefaultDocumen­tModule a DirectoryListin­gModule.

Modul URL Rewrite

Tento modul není standardní součástí instalace IIS 7 a je třeba ho stáhnout. Po instalaci můžete modul konfigurovat buď přes konzolu IIS 7 nebo opět pomocí ruční editace souboru web.config ve vaší aplikaci.

  1. Ve stromu webů najděte a vyberte vaši aplikaci
  2. Dvakrát klikněte na konfiguraci modulu URL Rewrite
    Přidání modulu rewrite
  3. Zobrazí se seznam pravidel, zatím prázdný
  4. Vyberte Add Rules…
    Přidání rewrite pravidel
  5. Vyberte pravděpodobně nejčastěji používané „User friendly URL“.
    User friendly URL
  6. Pravidlo si můžete nechat vygenerovat automaticky. Stačí vložit současné volání stránky a konfigurační utilita vám nabídne různé varianty pravidla. Také si můžete nechat vygenerovat „reverzní“ pravidlo, které přesměruje původní volání na „User friendly“.
    Přidávání rewritovacích pravidel
  7. Po kliknutí na OK je pravidlo vytvořené. Nyní si můžete prohlédnou změny v souboru web.config a pravidlo vyzkoušet.

Pokud migrujete existující aplikaci z Apache na IIS 7 a máte již hotová pravidla pro mod_rewrite, můžete tato pravidla naimportovat pomocí volby Import rules…

Import rewritovacích pravidel

Pak již stačí otevřít soubor s pravidly pro migrovanou aplikaci a provést import. Na následujícím obrázku je import .htaccess pro Drupal:

Import rewritovacích pravidel Drupalu

Nyní si ukážeme vytvoření vlastního modulu.

Jak si vytvořit vlastní modul?

Jednoduše. Stačí vytvořit třídu v .NET, která implementuje rozhraní System.Web.IHttpModule. Každý modul vstupuje do hry při vyvolání příslušné události IIS 7 serveru. Seznam událostí a jejich popis najdete v dokumentaci. Podle toho, kdy potřebujete do zpracování požadavku (HTTP requestu) vstoupit, si vyberete příslušnou událost, v které modifikujete požadavek podle potřeby. Nezapomeňte si uvědomit, že pokud v požadavku něco změníte, další modul dostane pouze změněný výsledek a nemá šanci zjistit původní verzi požadavku.

  1. Spusťte Visual Studio 2008 SP1
  2. Vytvořte webový projekt pro testování.
  3. Přidejte nový projekt typu Class Library do Solution.
  4. Přidejte referenci na knihovnu System.Web.
  5. Třída musí implementovat IHttpModule. Editor vám automaticky nabídne vytvoření metod rozhraní.
    Implementace IHttpModule
  6. V metodě Init (součást implementace rozhraní IHttpModule) si zaregistrujte příslušnou událost. Visual Studio vám opět pomůže s implementací handleru události:
    Metoda Init
  7. V kódu pro obsloužení události změňte požadavek dle potřeby.

Ukážeme si výpis ukázkového modulu SimpleUrlRewrite v jazyce C# (provádí jednoduchý rewrite URL naší aplikace):

using System;
using System.Text.RegularExpressions;
using System.Web;

namespace SimpleRewriteModule
{
    public class SimpleModRewrite : IHttpModule
    {
        Regex rx = new Regex("Kategorie/(.*).aspx", RegexOptions.IgnoreCase);

        public void Dispose() {}

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }

        void context_BeginRequest(object sender, EventArgs e)
        {
            // získání požadavku klienta
            HttpContext c = ((HttpApplication)sender).Context;

            Match m = rx.Match(c.Request.Path);

            if (!m.Success)
            {
                return;
            }

            string rewrite = rx.Replace(c.Request.Path, "Default.aspx?category=$1");
            c.RewritePath(rewrite);
        }
    }
} 

Testovací web musí mít nastavenu referenci na projekt s modulem. Do konfiguračního souboru pak stačí přidat odkaz na modul v sekci  <system.webServer>.<modules>.

<add name="SimpleRewriteModule" preCondition="managedHandler"
     type="SimpleRewriteModule.SimpleModRewrite"/> 

Generic Handler

Další zajímavou funkcí, která umožňuje snadno kombinovat PHP aplikace s ASP.NET, jsou tzv. GenericHandlers, které se používají typicky v situaci, kdy výstupem nemá být HTML, ale plain text, JSON apod. Jedná se o třídu, která implementuje rozhraní System.Web.IH­ttpHandler a je uložena v souboru s příponou ashx. Rozhraní IHttpHandler obsahuje metodu ProcessRequest, která je zavolána při spuštění handleru. Za obsah odpovědi jste v tomto případě komplet zodpovědní vy sami, proto musíte nastavovat i hlavičky HTTP odpovědi, zejména hlavičku Content-Type, abyste určili MIME odpovědi:

context.Response.ContentType = "text/xml"; 

Data zapisujete přímo do streamu odpovědi ( Response), který získáte z objektu HttpContext. Jednoduchá ukázka generování textového souboru:

public class Hello : IHttpHandler
{
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
} 

Závěr

PHP na IIS 7 funguje a jeho použití má svůj smysl. Snadno můžete kombinovat výhody PHP a ASP.NET a nejste omezeni jen na jednu platformu pro vývoj webových aplikací. Další užitečné informace najdete na oficiálních stránkách IIS a také bych vám doporučil článek Enhance Your Apps with the Integrated ASP.NET Pipeline z MSDN Magazine, v kterém najdete popis dalších modulů IIS 7 serveru a jejich možnou spolupráci s PHP aplikacemi.

Kód probíraný v článku si můžete stáhnout: IIS a PHP (ZIP 43352 bytů)


Autorem článku je Štěpán Bechynský, specialista pro vývojové nástroje ve společnosti Microsoft v České republice. Informace pro vývojáře také najdete na blogu odborníků z českého Microsoftu.

Anketa

Provozovali byste PHP na IIS?

       

Štěpán Bechynský

Specialista pro vývojové nástroje ve společnosti Microsoft v České republice.

Školení Google Analytics pro pokročilé

DW - Školení Google Analytics
  • Jak využít nové funkce Google Analytics
  • Vyhodnocování kampaní díky používání Multichannel funnels
  • Kde návštěvníci vašeho webu utíkají z objednávacího procesu.
  • Nebudete opakovat časté chyby při vyhodnocování dat o návštěvnosti.

Detailní informace o školení Google Analytics pro pokročilé »

Přehled názorů

phpinfo
Petr Steinbauer 1. 12. 2008 08:18
Nový
Prava
Mireczech 1. 12. 2008 09:20
Nový
└ 
Re: Prava
anonymní uživatel 1. 12. 2008 13:52
Nový
Web Platform Installer
Borek Bernard 1. 12. 2008 10:05
Nový
apache + php
luki.sk 1. 12. 2008 11:23
Nový
├ 
Re: apache + php
Borek Bernard 1. 12. 2008 11:29
Nový
│
└ 
Re: apache + php
nbusr 1. 12. 2008 16:50
Nový
└ 
Re: apache + php
Standa 3. 12. 2008 08:50
Nový
 
└ 
Re: apache + php
anonymní uživatel 5. 12. 2008 12:16
Nový
 
 
└ 
Re: apache + php
webdev 5. 4. 2009 03:05
Nový
poznamocka
dc 1. 12. 2008 11:57
Nový
└ 
Re: poznamocka
Borek Bernard 1. 12. 2008 12:01
Nový
Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
jurasek 1. 12. 2008 12:04
Nový
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Tomáš Cigánek 1. 12. 2008 12:29
Nový
 
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman 1. 12. 2008 12:35
Nový
 
 
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Stefan 1. 12. 2008 14:12
Nový
 
 
 
├ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman 1. 12. 2008 14:16
Nový
 
 
 
│
├ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
djanosik 1. 12. 2008 16:34
Nový
 
 
 
│
│
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Martin Hassman 1. 12. 2008 16:49
Nový
 
 
 
│
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
anonymní uživatel 2. 12. 2008 01:54
Nový
 
 
 
└ 
Re: Co ma tohle spolecneho s provozovanim nebo propagaci Linuxu ?
Jarda 1. 12. 2008 15:25
Nový
tahnete s temahle srackama z rootu pryc!
broukoid 1. 12. 2008 13:56
Nový
├ 
Re: tahnete s temahle srackama z rootu pryc!
Martin Hassman 1. 12. 2008 14:11
Nový
│
├ 
Re: tahnete s temahle srackama z rootu pryc!
Borek 1. 12. 2008 14:54
Nový
│
├ 
Re: tahnete s temahle srackama z rootu pryc!
Peter 1. 12. 2008 17:02
Nový
│
├ 
Re: tahnete s temahle srackama z rootu pryc!
JumBo 1. 12. 2008 19:10
Nový
│
├ 
Re: tahnete s temahle srackama z rootu pryc!
Pavel Šafařík 1. 12. 2008 19:17
Nový
│
│
└ 
Re: tahnete s temahle srackama z rootu pryc!
Pavel Šafařík 1. 12. 2008 19:20
Nový
│
│
 
└ 
Re: tahnete s temahle srackama z rootu pryc!
Martin Hassman 1. 12. 2008 19:26
Nový
│
│
 
 
└ 
Re: tahnete s temahle srackama z rootu pryc!
D.A.Tiger 1. 12. 2008 20:00
Nový
│
└ 
Re: tahnete s temahle srackama z rootu pryc!
JR 2. 12. 2008 01:52
Nový
└ 
Re: tahnete s temahle srackama z rootu pryc!
Láďa 1. 12. 2008 14:26
Nový
 
└ 
Re: tahnete s temahle srackama z rootu pryc!
dc 1. 12. 2008 14:53
Nový
 
 
└ 
Re: tahnete s temahle srackama z rootu pryc!
broukoid 1. 12. 2008 17:17
Nový
 
 
 
└ 
Re: tahnete s temahle srackama z rootu pryc!
anonymní uživatel 1. 12. 2008 20:56
Nový
RE: IIS 7 pro PHPčkáře
nbusr 1. 12. 2008 19:20
Nový
at zije GUI
Ded Kenedy 1. 12. 2008 22:50
Nový
Práva?!?
//R 1. 12. 2008 23:00
Nový
VMware...
Krtek 2. 12. 2008 10:14
Nový
└ 
Re: VMware...
Martin Hassman 2. 12. 2008 10:19
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem