👋 Nový obsah na borekb.cz

Info Tento blog je v "read-only módu" a nový obsah již nebude přibývat. O vývoji píšu na DevBlog.

Instalace PHP 5.1 a MySQL 4.1 na IIS 6

Update 14. července 2006: Některé formulace byly po komentářích Viléma Málka upraveny tak, aby článek nevyzníval, že PHP nelze na IIS provozovat jako ISAPI filtr. Mně se sice takto PHP rozchodit nepodařilo, ale nejspíš se jednalo o problémy konkrétní konstelace a ne o obecné překážky.

Článek popisuje instalaci PHP 5.1 a MySQL 4.1 na Windows 2003 Serveru R2. PHP bude nainstalováno jako CGI modul.

Co budete potřebovat

  • Windows 2003 R2, 180-ti denní trial, obsahuje IIS 6
  • PHP 5.1, ZIP distribuci i installer
  • MySQL 4.1 (už sice byla vydána verze 5.0 a 5.1 se chystá, nicméně hostingy budou ještě nějakou chvíli konzervativní a 4.1 bude aktuálně používaná verze)

Pokud si chcete instalaci vyzkoušet nanečisto, doporučuji stáhnout VMWare Workstation (použít by šel i Microsoft Virtual Server, který je zdarma) a instalovat ve virtuálním, zcela izolovaném prostředí. Předejdete tak nechtěným zásahům do ostrého operačního systému.

CGI vs. ISAPI

Tento článek popisuje instalaci PHP jako CGI modulu, což má své výhody i nevýhody. Někdy se uvádí, že ISAPI je rychlejší, ale na druhou stranu méně stabilní a náchylnější k chybám. Uslyšíte i názory vyvracející jak první, tak druhou část předchozí věty, takže ve výsledku bude záležet spíš na tom, pro jakou cestu se rozhodnete vy. Důležité je pouze vědět to, že mezi CGI a ISAPI existují rozdíly a z praktických důvodů byste se tak měli pokusit o instalaci té verze, která nakonec poběží na hostingu.

Proč je popisována instalace CGI a ne ISAPI?

  • Protože instalace PHP jako ISAPI filtru je dokonale popsána v článku Petera Guye.
  • Protože i přesto, že jsem dodržel veškeré pokyny v Peterových instrukcích (aspoň jsem o tom přesvědčen), instalace se nezdařila (PHP odmítalo brát v úvahu uživatelsky upravený php.ini a neustále používalo výchozí hodnoty).

Instalace

Instalace Windows 2003 Serveru i IIS 6.0 je snadná klikací záležitost, ale jak už to tak chodí, PHP i MySQL vyžadují poměrně velkou pozornost, protože drobné opomenutí zdánlivé maličkosti může způsobit celkovou nefunkčnost.

Nejdřív pár odkazů. Základní instrukce poskytuje oficiální manuál a pokud potřebujete opravdu dlouhý, podrobný a kvalitně zpracovaný návod na instalaci PHP na IIS 6 jako ISAPI filtr, doporučuji již zmíněný návod Petera Guye.

  1. Nainstalujte PHP. Nejjednodušší je použít instalátor, ale i manuální instalace je snadná – v podstatě stačí PHP rozbalit do C:\PHP a provést pár dobře mířených zásahů do IIS. Při manuální instalaci však musíte dávat pozor na některé detaily (např. správné nastavení php.ini), proto popíšu hybridní postup – nejdřív instalátor, potom ruční konfigurace.
    1. Spusťte instalátor a nechte se vést průvodcem. Většina věcí je defaultně nastavena vyhovujícím způsobem. Další postup předpokládá, že jste PHP nainstalovali do adresáře C:\PHP.
    2. Abyste měli k dispozici všechny funkce PHP ze standardní binární distribuce (instalátor obsahuje nutné minimum), nakopírujte do adresáře C:\PHP soubory ze ZIP balíku, který jste stáhli z php.net.
    3. Nyní je potřeba „dokonfigurovat“ IIS, instalátor bohužel vše automaticky nezvládne. Spusťte IIS konzoli: Start > All Programs > Administrative Tools > IIS
    4. Přejděte na záložku Web Service Extensions a klikněte na odkaz Add a new Web service extension…. Extension name zvolte podle vlastní chuti, např. PHP CGI a do Required files přidejte odkaz na C:\PHP\php-cgi.exe. Nezpomeňte zaškrtnout Set extension status to Allowed. Tento krok by instalátor měl dělat automaticky, ale asi není dobře připraven na novou verzi IIS.
    5. Pravým tlačítkem klikněte na Web Sites, vyberte Properties, přejděte na záložku Home Directory a zkontrolujte následující:
      • ve spodní části musí být Execute permissions nastaveno aspoň na Scripts only
      • když klepnete na Configuration…, na záložce Mappings by měla být vytvořena přípona .php s mapováním na soubor C:\PHP\php-cgi.exe
      • vraťte se na hlavní dialog Web Site Properties a pokud chcete automaticky spouštět soubory index.php, přejděte na záložku Documents a přidejte index.php
      • nyní jste pro správný běh připravili PHP soubory, ale pokud budete chtít, aby vám dobře fungovaly i statické soubory typu http://localhost/index.htm, musíte na záložce Home directory zaškrtnou minimálně Read práva pro danou Local path (typicky C:\InetPub\wwwroot)
    6. Abyste nemuseli nic kopírovat do C:\WINDOWS\Sys­tem32, přidejte do proměnné prostředí PATH řetězec C:\php – systémové proměnné najdete ve vlastnostech tohoto počítače na záložce Advanced pod tlačítkem „Environment Variables“. Pokud chcete, aby se php.ini načítalo ze složky C:\PHP a nikoliv z C:\WINDOWS, přidejte ještě novou proměnnou prostředí s názvem PHPRC a s hodnotou C:\PHP. Nyní restartujte počítač, jinak se změny neprojeví.
    7. Teď je ještě potřeba nastavit práva. Pokud se počítač jmenuje WIN03, je klíčovým uživatelem IUSR_WIN03. Přidejte mu oprávnění na adresář C:\PHP, C:\PHP\ext a všechny soubory v těchto složkách. Toto je velmi důležité. Stejný uživatel by měl mít rovněž správná oprávnění nastavena na soubory a složky pod wwwrootem.
    8. Proveďte případné žádané úpravy v php.ini (pokud jste to ještě neučinili, přesuňte soubor z C:\WINDOWS do C:\PHP). Já jsem si tento soubor vyžádal od svého webhostera, abych mohl mít lokál nastavený co nejpodobněji jako na serveru.
  2. Tak, teď by mělo být PHP nainstalováno. Je na čase vytvořit drobný skript, který bude obsahovat aspoň funkce session_start() a phpinfo(). Umistěte ho do C:\Inetpub\wwwroot, opět by na něj měl mít nastavena práva uživatel IUSR_Win03 a soubor zobrazte v prohlížeči. Pokud jste postupovali přesně podle pokynů, neměl by nastat žádný problém. Hlavně zkontrolujte, jestli se vám dobře načetlo php.ini (phpinfo() tuto informaci vypisuje na šestém řádku) a jestli se v adresáři vyhrazeném pro session data (nastavuje se v php.ini) objevil nějaký soubor (klidně s délkou nula bajtů).
  3. Instalace MySQL je opět velmi snadná – v průvodci opět můžete většinou nechat defaultní hodnoty.
  4. Teď už jen propojit PHP s MySQL. Instalace extensions je popsaná v manuálu, v podstatě se jedná o malý zásah do php.ini – zkontrolujte, že máte dobře nastavený extension_dir a že před extension=php_mys­ql.dll není středník. MySQL knihovna je závislá na souboru libmysql.dll, který najdete v C:\PHP, proto je životně důležité, aby cesta C:\PHP byla součástí proměnné prostředí PATH a aby měl soubor libmysql.dll měl nastavena práva pro uživatele IUSR_Win03. Funkčnost prověříte přidáním funkce mysql_connect() do testovacího skriptu.

Tak, a je to.

Pár poznámek závěrem

  • Při správném postupu není nutno nic kopírovat do C:\WINDOWS (ani php.ini, ani DLL knihovny). Klíčem k úspěchu je PATH=„…;C:\php“.
  • Jakékoliv problémy velmi pravděpodobně způsobuje problém s nastavenými právy. Doporučuji všechny soubory, ať už .php skirpty nebo EXE a DLL v C:\PHP zpřístupnit pro čtení a pro vykonávání uživateli IUSR_*.
  • Pokud narazíte na chybu „CGI Error; The specified CGI application misbehaved by not returning a complete set of HTTP headers.“, je pravděpodobně chyba v php.ini souboru. Viz CGI users must set the cgi.force_redirect PHP directive to 0 inside php.ini.
  • Druhá věc, která mě delší dobu trápila, byla neschopnost PHP správně najít php.ini. U CGI modulu by mělo jít umístění php.ini určit pomocí proměnné prostředí PHPRC, případně přidáním klíče HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath = C:\PHP (jednoduché zpětné lomítko) do registrů.

Přeji hodně štěstí při instalaci. Občas ho budete potřebovat :)

Zařazeno do kategorií | |
martin (Pá, 2006-04-28 13:50):

mod rewrite?

PHP na IIS je hezká věc, ale jak na IIS nahradit mod_rewrite? ISAPI filtry co jsem našel byly všechny drahé…

Borek (Ne, 2006-04-30 19:49):

ISAPI rewrite lite je zdarma, ale samozřejmě záleží, co nabízí hosting. Přinejhorším lze použít vlastní 404 stránku a „mod_rewrite“ si udělat sám.

Vilém Málek (Pá, 2006-07-14 10:40):

Náhodou jsem nyní narazil na tento článek a chtěl bych napravit falešný dojem, že PHP5 nelze na IIS6 nainstalovat jako ISAPI modul. My, staří harcovníci, jsme totiž už dávno zjistili, že nejdůležitějším bodem celého postupu jeza všech okolností a vždy se vyhnout všem automatickým instalátorům. Pokud provedete instalaci ručně, vše funguje bez nejmenších problémů. Abych zde nemusel celý postup popisovat, doporučuji například ten, který už léta udržuje aktuální Peter Guy – viz http://www.pe­terguy.com/…ll_I­IS6.html ;-)

Borek (Pá, 2006-07-14 11:00):

Na začátku článku je napsáno, že v mém případě ani přesné dodržení všech kroků z vámi i mnou odkazovaného článku Petera Guye nevedlo k úspěšnému rozchození PHP pod IIS. Nevím, proč tomu tak bylo, ale jednalo se o smutný fakt, který mě přiměl k vytvoření alternativnímu návodu, který má podle mého názoru větší šanci na úspěch.

Co se týče instalátorů, ten v PHP pouze rozbalí soubory a předpřipraví php.ini, takže se není čeho obávat. Obecně vám dávám za pravdu, že manuální instalace je vždy ta jediná, kterou máte plně pod kontrolou, ale v tomto konkrétním případě je nejjednodušší použít hybridní instalaci – nejdřív instalátor, pak ruční nakopírování dodatečných souborů.

Pokud byste věděl něco o problému nenalezení php.ini při použití ISAPI filtru, určitě bych měl zájem o řešení. CGI používám více méně z donucení…

Vilém Málek (Pá, 2006-07-14 11:47):

Pozor, automatický instalátor PHP pro Windows neobsahuje totéž, co ZIP soubor s binární verzí PHP – především neobsahuje všechny náležitosti potřebné pro správnou funkci ISAPI verze, je určen výhradně k instalaci CGI verze.

Kromě toho obsahuje automatický instalátor instrukce pro integraci PHP do IIS (a některých dalších serverů), tedy neupravuje pouze php.ini, ale také zasahuje do různých částí OS a IIS. (Nikdy jsem se ovšem nesetkal se situací, že by po automatické instalaci PHP v CGI režimu na IIS opravdu fungovalo, vždy bylo nutno sem tam něco upravit.)

Už před lety jsem přišel na to (a nejen já), že největší problém s instalací PHP na IIS je ten, že to lidé obvykle zkoušejí nejprve s různými instantními balíčky, případně automatickým instalátorem z PHP.net. Tyhle věcičky šíleně zaneřádí celý systém (troufám si říci, že ho přímo nevratně poškodí), takže při následné aplikaci správného manuálního postupu se člověk nedobere žádoucího výsledku, což si lze vykládat (mylně) jako selhání postupu.

K testování různých postupů používám také VMware (a teprve funkční přenáším na fazické stroje). Stáhl jsem si i ten trial Win2k3 R2 Serveru, kdyby se náhodou nějak lišil od finální verze, kterou jinak používám. Vyzkoušel jsem Peterův postup a funguje, takže ani virtualizace, ani trial verze serveru problémy asi nezpůsobuje…

(Omlouvám se, nějak jsem přehlédl, že v článku je odkazován právě Peterův postup ;-)

Borek (Pá, 2006-07-14 12:11):

Dobrou zprávou je, že Peterův postup funguje, špatnou zprávou je, že už jsem na tom asi tak špatně, že nedokážu dodržet přesné pokyny :) No abych pravdu řekl, v mé VMWare se občas dějí divné věci, např. se mi mezi restarty nepamatují některá nastavení v registrech, tak to alibisticky svedu na věci mezi nebem a zemí :)

Ohledně instalátoru: já jeho univerzální použití neobhajuju, uvedl jsem ho ve zcela konkrétní situaci jako pomůcku při instalaci CGI (proto není důležité, že neobsahuje věci pro ISAPI filtr). S vašimi komentáři v zásadě souhlasím a nemyslím si, že bychom byli v nějaké zásadní názorové neshodě.

Vilém Málek (Pá, 2006-07-14 12:18):

Já žádnou názorovou neshodu nevidím, pouze zásadně nesouhlasím s prvním bodem zde zveřejněného návodu a především s jeho tučně zvýrazněnou částí.

Dříve se PHP nedoporučovalo instalovat jako ISAPI, protože jak ze strany PHP, tak ze strany IIS existovaly inkompatibility, které to znemožňovaly. Proto se používalo externí FastCGI. V PHP5 je však již vše vyřešeno (a FastCGI bylo integrováno do standardního CGI), takže není důvod ISAPI nepoužívat.

Navíc CGI a ISAPI verze PHP se chovají odlišně, takže pro kvalitní testování je nezbytné mít stejnou verzi jako na serveru, jinak je zde reálné nebezpečí, že některé aplikace po přenosu z vývojového prostředí do prostředí produkčního vůbec nebudou fungovat…

Borek (Pá, 2006-07-14 14:55):

Vaše komentáře mě přiměly k úpravě článku, díkyi za jeho zkvalitnění.

Vilém Málek (Pá, 2006-07-14 10:54):

A když už jsem tady, dovolil bych si ještě jednu doplňující poznámku k práci s MySQL z PHP. Není na škodu mít opravdu funkční a aktuální ovladače – viz http://dev.mys­ql.com/…nnector/php/ ;-)

Jedi (Čt, 2006-09-07 11:25):

„Nepodarit se rozbehnout PHP na IIS v isapi modu?!!…OMFG!!“- vyhody v rychlosti a stabilite jsou celkem zasadni, nevyhody se taky najdou nebojte. Moje rada pro pokrocile zni takhle: 0a) instalovat a zaplatovat iis, a dale vse delat pod admin uctem 1b) stahnout stable instalator a stable full verzi(cgi) 2c) pustit instalator vybrat spravnou verzi IIS…tot vse 3d) do instalovane cesty do kopirovat z Full verze zbytek souboru a adresaru (php.ini je pod windows takze si ho neprepisete) 4e)nastavit nad upload a session adresarem prislusna prava zapisu pro IUSR (pokud jste lockdownovali ci jinak upravovali system pak pouzijte tato prava jak pro aplikace tak pro iuserove uzivatele) 5f)doladit nastaveni php.ini dle manualu (cgi.force atp), nezapomenout poradne zkontrolovat extension(nektere potrebuji ke sve praci stahnout dalsi knihovny napr extension dll pro MSSQL, nektere proste na kterych OS nefunguji dobre, proto na zacatku vyberte jen gd2 + mysql a zbytek ladte az Vam to pobezi) a pracovni cesty 6g)zkopirovat dll php z rootu PHP do windows/system32 7h)zkopirovat dll isapi z PHP/sapi/ do windows/system32 8i)nastavit isapi filtr v mmc iis prislusneho virtualniho serveru na prislusnou dll knihovnu v PHP/sapi/ 9j)nastavit v mmc iis prislusneho virtualniho serveru Konfiguraci aplikaci-> extenzi .PHP prekladat opet pres dll z PHP/sapi/ 10k) restartovat pc (pokud jste tak neucinili hned po instalaci v bode 2c)- instalarorem, pokud ucinili tak staci restartovat IIS sluzbu) 11l) otestovat phpinfo(); 12m) podekovat me

Reseni chyb: pokud Vam to hlasi pri startu chyby nebo nenabehne sluzba IIS pak se vratte do php.ini a odladte si extensions metodou pokus/omyl, nakonec prijdete na to ze ji mate spatne nebo jste neco zapomneli odstrednikovat/o­pravit ->a hlavne RTFM!!

Pokud Vam ani tohle nepomohlo, pak mate na 100% rozbordelene IIS pripadne i Vas OS-nejspis tim jak jste si s tim porad hrali rucne a delali podobne nesmysly ze zarucenych navodu, v tom pripade bych doporucil testovat nejdrive na VMWARE na ciste instalaci a pak teprve sem psat „Me to nejde, mas to spatne!!“

O zabezpeceni IIS pomoci lockdownu a dalsich metod/filtru se tu rozepisovat nebudu, protoze predpokladam ze tu radu hledaji hlavne domaci kutilove.

k modrewrite-> FREE ale je to dost orezane http://cheeso­.members.winis­p.net/IIRF.as­px http://www.iis­mods.com/…te/in­dex.htm PLACENA multidomain verze, nicmene TOP 1 http://www.i­sapirewrite.com/ PLACENA ale levnejsi verze nez ISAPI rewrite http://www.qwer­ksoft.com/…te­/usage.asp

Syntakticke chyby v mem textu jsou zarucene protoze to pisu z hlavy a nemam casu nazbyt, navic je to pro pokrocile kutili co se aspon nejaky cas vrtali v MMC pro IIS vi kde co najdou.

Honza (Út, 2007-10-16 10:01):

Zdravim, rozchodil jsem korektne PHP s IIS 6.0 na w2k3r2 serveru. Ale mam tam jedno ALE. Nefunguji mi relativni cesty. Pokud zkusim pomoci funkce file_exists otestovat zda existuje soubor, tak ikdyz je vse spravne (a na Apache s PHP funguje), tak mi nahlasi ze neexistuje. Jedine kdy to spravne overi je, kdyz dam absolutni cestu („c:\web\soubor­.php“) Nevite co s tim ? Jinak PHPINFO jede v pohode, php take. Dik

Komentáře jsou uzavřeny (blog je v read-only módu). Pokud mě chcete kontaktovat, můžete mailem.