PHP 5.3.0 x64, Windows 2003 und IIS6 – Ein Installationsguide

Inhaltsverzeichnis

 

1. Vorwort Inhalt

PHP-LogoSeit gestern gibt es die neue PHP 5.3.0; während Linux-Benutzer schon länger einfach aus dem Quelltext ihre x64 Binaries kompilieren können, waren wir Windows-User mit IIS bislang auf entweder den 32bit ISAPI von offizieller Seite aus angewiesen oder konnten das Fusion LAN x Projekt installieren mit doch einer beachtlichen Anzahl an Erweiterungen.

Leider wurden die Dateien seit 2007 nicht mehr verändert und für Produktionssysteme war es sowieso nicht geeignet, da öfters einmal eine leere Seite mit „PHP encountered an access violation“ erschien statt der eigentlichen Webanwendung. Nun gut, Rettung naht, die neue x64 läuft erstaunlich stabil und vergleichbar performant; allerdings habe ich noch keine aussagekräftigen Last-Tests durchführen können.

Kurz noch zwei Gründe für den Aufwand mit 64bit PHP unter Windows:

  • Wir möchten möglichst nur eine einzige Maschine haben, die alles kann; die Aufgabe eines Windows-Servers ist neben der Userverwaltung eben auch im wesentlichen die Exchange-Groupware. Und deren Outlook-Webaccess läuft eben nur unter einem 64bit-IIS.
  • Wir möchten keine zwei Webserver (z.B. 32bit Apache, x64 IIS) auf einer Maschine. Unterschiedliche Sicherheitskonzepte, eine neue zu wartende (Updates, Backups) Software, usw.

2. Installation von PHP Inhalt

Die folgenden Ausführungen gelten für einen Windows 2003 Server x64 R2 mit SP1 und IIS6 mit PHP 5.3.0 x64 VC9.

2.1 PHP im CGI-Betrieb Inhalt

PHP x64 5.3.0 wird für IIS nicht mehr als Modul (ISAPI) angeboten, sondern kann nur noch als CGI ausgeführt werden. Das heißt, dass der IIS für jeden Aufruf einer PHP-Seite die Eingaben des Users (URL, Header, Cookies, POST-Daten) über STDIN an die PHP-Executable übergibt und die vollständige Ausgabe (HTML) inkl. aller Headerzeilen von STDOUT liest und 1:1 an den Browser/Client des Users zurückliefert.

Wie schon erwähnt konnte ich auf den Anwendungen, bei denen eine Zeitmessung im Millisekundenbereich eingebaut ist, keinen nennenswerten Unterschied in der Laufzeit feststellen; es scheint ähnlich performant wie eine 5.2.x ISAPI-Installation zu laufen, eventuell sogar einen Tick schneller.

[Update] Die Scriptgeschwindigkeit scheint vergleichbar zu sein, der Start eines Scriptes ist hingegen merklich verzögert. Viele kleine Dateien / Bilder z.B. für einen Baum aus einer DB auszulesen und ausliefern zu lassen geht nun sichtbar langsamer.

[Update 2] Auch dieses Problem läßt sich lösen, wenn man das FastCGI für den IIS installiert und zum laufen bekommt. Ich hatte damit meine liebe Not, eventuell hilft dieser Artikel jemandem weiter. Im direkten Vergleich von IIS 6 und Apache 2 mit libphp5.so muss ich allerdings sagen (auch wenn ich keine Zahlen nennen darf), dass die Apache-Konfiguration einfach um Längen schneller läuft. Aber egal, wir wollen ja eine einzige Maschine, die alles kann.

2.2 Vorbereitung Inhalt

  1. Zunächst einmal müssen Sie Ihre alte PHP-Installation sichern. Ich hatte vorher die FusionLAN x Binaries in C:\Programme\PHP installiert und habe sie nach C:\Programme\PHP_old verschoben.
  2. Laden Sie nun zwei Dateien herunter auf den Server, der Einfacheit halber auf Ihren Desktop.

    Anmerkung: PECL4WIN scheint schon länger nicht erreichbar zu sein. Einige wichtige PECL-Extensions (php_zip.dll, PDF*, usw.) sind noch nicht verfügbar, ich rate davon ab, die Binaries aus dem Fusion-LAN x Projekt zu nehmen; hat bei mir nicht funktioniert.

  3. Sichern Sie Ihre alte php.ini, sofern Sie sie unter C:\Windows abgelegt hatten, in einen anderen Ordner, z.B. Ihren Desktop.
  4. Sie müssen nun, wie empfohlen, alle Spuren von PHP im Windows-Ordner entfernen. Suchen Sie nach „php*“ unter C:\Windows (+Unterordner) und löschen Sie die Dateien.

2.3 Installation von PHP Inhalt

  1. Erstellen Sie den Ordner „C:\Programme\PHP„.
  2. Entpacken Sie den Inhalt der php-Zip-Datei inkl. Verzeichnis-Struktur in diesen Ordner. Sie sollten nun drei Unterordner, einige DLLs und EXE-Dateien darin sehen, im Screenshot ist PEAR schon installiert, deswegen ist dort noch mehr zu sehen.
    PHP Verzeichnis-Struktur
  3. Kopieren Sie die vorhin gesicherte Datei php.ini nach C:\Programme\PHP.
  4. Wichtig: Setzen Sie die Verzeichnissicherheit von C:\Programme\PHP für den Benutzer IUSR_$Maschinenname auf „Lesen, Ausführen“ und vererben Sie diese Rechte auf alle untergeordneten Objekte.
  5. Passen Sie Ihre PATH-Umgebungsvariable dahingehend an, dass sie C:\Programme\PHP als Eintrag, besser noch als ersten Eintrag enthält. Klicken Sie mit der rechten Maustaste auf den Arbeitsplatz -> Eigenschaften -> Reiter „Erweitert“ -> Knopf Umgebungsvariablen. Achtung: Änderungen werden nur durch einen Neustart übernommen.
  6. Installieren Sie nun die VC++ 2008 Redist-Komponenten durch Doppelklick auf die eben gespeicherte EXE-Datei.

2.4 Konfiguration von PHP Inhalt

Hier sind einige Dinge einzustellen, auf die man auch erst einmal kommen muss, und die so im Internet noch nicht zu finden waren. Öffnen Sie die Datei C:\Programme\PHP\php.ini mit einem Texteditor. Ich kann hierfür Flo’s Notepad2 sehr empfehlen. Achten Sie im Folgenden darauf, die Optionen nicht nur auszufüllen, sondern auch das Kommentarzeichen („;“ am Anfang der Zeile) zu entfernen, sonst wird die Option nicht gelesen. Nachdem PHP sowieso für jeden Seitenaufruf neu gestartet wird, werden Änderungen sofort übernommen.

  1. Zunächst einmal sollten Sie den doc_root auf das Stammverzeichnis Ihrer WWW-Daten legen (IIS-Standard: C:\Inetpub\wwwroot\). Tragen Sie an geeigneter Stelle ein:
    »» doc_root = „c:\Inetpub\wwwroot\“
  2. Setzen Sie weitere Optionen jeweils an den bereits vorgegebenen Stellen:
    »» include_path = „.;c:\Programme\php\PEAR;c:\Programme\php\ext“
    »» default_mimetype = „text/html“
  3. Wichtig: FORCE-REDIRECT ausschalten, da sonst ein Fehler bei „header(‚Location: …‘);“ ausgegeben wird.
    »» cgi.force_redirect = 0
  4. Wichtig: Weisen Sie PHP an, immer Status 200 senden. Der IIS agiert lediglich als „Durchleiter“ des Datenverkehrs. Wenn in der Antwort von PHP kein „Status: 200“ (siehe Screenshot) enthalten ist in den Headerzeilen, denkt der IIS, dass das PHP-Programm einen Fehler in der Ausführung hat und nicht einwandfrei antwortete.
    PHP Status 200
    Es kommt die bekannte IIS-Fehlermeldung:

    Bad Gateway:
    The specified CGI application misbehaved by not returning a complete set of HTTP headers

    oder auf Deutsch:

    CGI-Fehler:
    Die angegebene CGI-Anwendung hat keinen vollständigen Satz von HTTP-Headern zurückgegeben.

    »» cgi.nph = 1

  5. Optionale Zeitzoneneinstellung: Sofern Sie in Ihrer Anwendung die „date()“ Funktion benutzen, wird nun zwingend eine Zeitzone vorausgesetzt. Stellen Sie eine Standardzone wie nachfolgend ein.
    »» date.timezone = ‚Europe/Berlin‘

2.5 Test der PHP-Installation Inhalt

Nachdem Sie den Server neu gestartet haben (um die PATH-Anpassungen zu übernehmen), erstellen Sie eine Datei test.php in Ihrem www-Verzeichnis, z.B. also „C:\Inetpub\wwwroot\test.php„. Öffnen Sie sie mit einem Texteditor und schreiben „<? phpinfo(); ?>“ als Inhalt in die Datei. Speichern Sie und schließen den Editor.

Öffnen Sie ein Command-Prompt und wechseln nach C:\Inetpub\wwwroot. Dort geben Sie auf der Kommandozeile „php.exe < test.php“ ein; es sollte nun eine nicht formatierte Ausgabe von PHP-Info folgen.

Testen Sie auch die vom CGI-Binary formatierte Ausgabe (inkl. HTML-Tags) mittels „php-cgi.exe < test.php“. Sofern beide Tests erfolgreich verliefen, müssen Sie nur noch den IIS richtig konfigurieren, damit die PHP-Webseiten wieder richtig ausgeliefert werden.

2.6 Migration-Guide für PHP 5-Code Inhalt

Bitte beachten Sie den Migration Guide von php.net; PHP5(.2)-Code ist zwar (noch) kompatibel, produziert aber einige Warnmeldungen.

  1. Veraltete („deprecated“) Funktionen und Feature finden Sie hier.
  2. Inkomatibilitäten für den Programmcode finden Sie hier. Beachten Sie insbesondere die Änderung bei den Zeitzonen: PHP verläßt sich nicht mehr auf die Serverzeitzone, wenn Sie das nicht explizit in der php.ini setzen. Es macht sowieso Sinn, für Seiten mit globalem Scope die Zeitzone aus dem Browser auszulesen oder für den User als Attribut zu speichern.

3. Konfiguration des IIS Inhalt

Starten Sie die MMC mit dem IIS-Snapin und verbinden sich mit dem Server.

3.1 Webdiensterweiterungen Inhalt

Klicken Sie im Baum links auf „Webdiensterweiterungen“ und sehen sich die Liste an.

Falls PHP noch nie installiert war, legen Sie eine neue Erweiterung an:

  1. Klicken Sie auf „neue Webdiensterweiterung hinzufügen“
    PHP Webservice
  2. Geben Sie als Name „PHP“ ein
  3. Fügen Sie die Datei „C:\Programme\PHP\php-cgi.exe“ (und nicht wie anderswo beschrieben, die php.exe) als erforderliche Datei hinzu.
  4. Setzen Sie den Status auf „zugelassen“.
  5. Klicken Sie „OK“

Ansonsten müssen Sie in den Erweiterungen nur die vermutlich vorhandene ISAPI (php5isapi.dll) entfernen, und das PHP CGI „php-cgi.exe“ hinzufügen. Achten Sie darauf, dass die Erweiterung auf „zugelassen“ steht und einen grünen Haken in der Übersicht hat.

3.2 Scriptmapping Inhalt

Konfigurieren Sie nun das Scriptmapping für IIS. Klicken Sie mit der rechten Maustaste auf „Standardwebseite“ unter „Websites“ und konfigurieren Sie eine neue oder bestehende Anwendung wie abgebildet.

Anwendungseinstellungen für PHP und IIS6

3.3 Test der Gesamtinstallation Inhalt

Starten Sie nun den IIS neu, indem Sie den IIS Verwaltungsdienst neu starten.

Öffnen Sie einen dann Webbrowser und navigieren Sie zu http://$maschinenname/test.php; Sie sollten die gewohnte phpinfo(); Ausgabe angezeigt bekommen.

All Done.

4. Installation von PEAR Inhalt

Für PECL / PEAR Extensions muss zwingend das neueste PEAR installiert werden. Laden Sie zunächst „go-pear.php“ von http://pear.php.net/go-pear in das Verzeichnis C:\Programme\PHP herunter. Speichern Sie die Datei ggf. von Hand als „go-pear.php“.

Führen Sie dann auf der Kommandozeile „php go-pear.php“ aus und folgenden den Anweisungen auf dem Bildschirm (Warnungen für „deprecated“ können Sie ignorieren, diese werden in einer späteren Version von go-pear wahrscheinlich behoben sein):

  • <Enter> to continue
  • <Enter> bei HTTP-Proxy
  • <Enter> bei File Layout
  • <Y><Enter> bei Bundled packages

Die Installation sollte nun eine Weile laufen. Klicken Sie nach Abschluß im Ordner C:\Programme\PHP auf die Datei PEAR_ENV.reg doppelt; es werden die nötigen PATH-Variablen gesetzt (Achtung: Übernommen erst nach Neustart des Servers!).

Sie können nun PEAR und PECL-Extensions installieren.

2 Kommentare zu “PHP 5.3.0 x64, Windows 2003 und IIS6 – Ein Installationsguide”

1.   Kommentar von Goeke, Matthias
Erstellt am 05. März 2012 um 09:04 Uhr.

Hi,
danke super Anleitung!! Klappt alles soweit jedoch habe ich ein Problem mit Windows 2003, IIs 6.0, PHP 5.3.10 und TYPO3 4.6.4.
Sobald ich mich in das Backend von Typo3 anmelde kommt folgende Fehlermeldung:

Die angegebene CGI-Anwendung hat keinen vollständigen Satz von HTTP-Headern zurückgegeben

alle anderen PHP-Seiten funktionieren.

Gruß,
M. Goeke

2.   Kommentar von McSeven
Erstellt am 05. März 2012 um 15:54 Uhr.

Grüße, bitte prüfe, ob, wie in 2.4, Punkt 4 beschrieben, PHP wirklich *immer* „Status OK 200“ zurückgibt. Der IIS6 kommt sonst damit nicht klar. Im einfachsten Falle ist nur die falsche php.ini in Verwendung, siehe auch Stichwort SysWOW64 Umleitung, wo alles 64bittige nicht aus system32, sondern aus syswow64 gelesen wird.

Egal, mach mal ein script mit php_info(); und schau den Pfad an, welche php.ini er liest. Und da schau, ob die richtige Konfiguration drinnen steht.

Dann erweitere das Script um http://www.php.net/manual/de/function.http-response-code.php mit Code 404, und schau, ob es immer noch 200 ist.

Und schau auch ins Errorlog von PHP, ob nicht da etwas schief geht.

PS: Ich bin inzwischen auf IIS 7.5, da tut’s auch mit der aktuellen einwandfrei.

Einen Kommentar hinterlassen