Windows: 64-bit Apache und 64-bit PHP

Unter Linux und BSD schon lange kein Thema mehr, unter Windows allerdings schon. Ein 64-bit Apache als Webserver, dazu ein 64-bit PHP, aber wie bekommt man die beiden Zusammen?

Zwei gute Quellen für ein 64-bit Apache für Windows sind Apache Lounge und Anindya’s Blog.

Auf beiden Seiten gibt es jeweils den aktuellen, stabilen Apache. Bei Apache Lounge sogar die Beta von der kommenden Version.

Als Quelle für aktuelle 64-bit PHP-Versionen kann ebenfalls Anindya’s Blog verwendet werden. Darüber hinaus finden sich dort viele PHP-Erweiterungen als 64-bit Version.

Die “Kunst” besteht darin, Apache x64 und PHP x64 zusammenzubringen.

Das Problem, sofern man es so nennen kann, beginnt mal wieder mit der Entscheidung, ob nun Non-Thread Safe oder Thread Safe für PHP verwendet werden soll.

Verwendet man die Thread Safe-Version, so findet sich im PHP-Archiv von Anindya das entsprechende Apache Module. Dieses kann wie gewohnt in der “httpd.conf” konfiguriert werden:

# PHP
LoadModule php5_module "c:/php/php5apache2_2.dll"
AddHandler application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "C:/php"

Möchte man allerdings die Non-Thread Safe-Version von PHP verwenden, bleibt wohl nur der Weg über FastCGI. Zumindest ist mir bislang kein Non-Thread-Safe-PHP-Apache-Module für Windows bekannt.

In diesem Fall funktioniert das nur mit dem 64-bit Apache und dem dazugehörigen FastCGI-Module von Apache Lounge und der 64-bit Version von PHP von Anindya.

Die Konfiguration in “httpd.conf” sieht wie folgt aus:

# FastCGI
LoadModule fcgid_module modules/mod_fcgid.so
FcgidInitialEnv PHPRC "c:/php"
FcgidInitialEnv PATH "c:/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
FcgidInitialEnv TMP "C:/WINDOWS/Temp"
FcgidInitialEnv windir "C:/WINDOWS"
FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 500

Ferner muss in Zeile 219 noch “ExecCGI” angehängt werden.

Update 16.05.2012

Im Abschnitt “<Directory “c:/Apache24/htdocs”>”

Die Zeile 251 “Options Indexes FollowSymLinks” um ExecCGI erweitern:

Options Indexes FollowSymLinks ExecCGI

Update 18.05.2012

Damit PHP-Dateien über FastCGI abgearbeitet werden, muss folgender Code in der “httpd.conf” eingetragen sein:

<Files ~ "\.php$">
AddHandler fcgid-script .php
FcgidWrapper "c:/php/php-cgi.exe" .php
</Files>

Eine allgemeine Anleitung zu Apache mit FastCGI und PHP findet sich hier.

18 Kommentare

  1. Thomas

    Hallo

    Vielen Danke für die Informationen. Ich “versuche” gerade einen kleinen Webserver, der zu hause stehen wird, aufzusetzen.
    Win7, Apache, PHP, MYSQL etc. Es soll/wird alles auf 64 Bit sein. Daher ist deine Beschreibung schonmal sehr hilfreich!
    Lediglich der Satz “Ferner muss in Zeile 219 noch “ExecCGI” angehängt werden.” ist unklar.
    Zeile 219 besteht in “meiner” Orginal-httpd nur aus einem # ???
    Es wäre schön, wenn Du diesen Punkt etwas ausführlicher beschreiben könntest, besonders für so Typen wie mich, die sich gerade in die Materie einfuchsen und noch keine tiefen Kenntnisse haben.
    Wo genau muss ExecCGI angehängt werden?
    Vielen Dank!

  2. andy

    Ich hab’s grad auf den aktuellen Stand gebracht. Danke für den Hinweis.

  3. Thomas

    Das war ja eine schnelle Reaktion!
    Nun denn, soweit so schlecht.
    Habe das in die httpd so eingetragen. Allerdings tut sich nichts.
    Ein phpinfo(); in der Muster index.html bleibt ohne Ergebnis, auch keine Fehlermeldung. Die Pfade auf meinem System entsprechen denen im Mustercode oben. Da sollte also kein Problem auftreten.
    Im Readme zu “mod_fcgid 2.3.7 for Apache 2.4.x Win64″ steht noch, dass man in die httpd die Zeilen:

    AddHandler fcgid-script .php
    FcgidWrapper “c:/php/php-cgi.exe” .php

    einfügen soll.
    Sobald ich das tue kann ich den Apacheservice nicht mehr (re)starten “The requested operation has failed!”
    Wat nu?

  4. Thomas

    PS: Im Kommentar ist einiges vom Code verschluckt worden!
    Ich versuche es mal anders:
    <— ”
    AddHandler fcgid-script .php
    FcgidWrapper “c:/php/php-cgi.exe” .php
    —>

  5. Thomas

    Geht auch nicht. Ggf mal selbst ins Readme gucken, sorry!

  6. Thomas

    Oh Mann, wie peinlich.
    Die Pfade waren doch nicht richtig! Habe /Programme/ gesehen wo keins war!
    Der Server startet nun wieder 🙂
    Jedoch bleibt eine Abfrage über phpinfo(); ohne Ergebnis, leer.
    Quelltext der index.html
    It works!

    Und php

    Mir scheint es, als dass der Server den php tag nicht als solchen interpretiert….?

  7. Thomas

    Mist, wieder kein Code. Wie kann ich hier Code posten?

  8. Thomas

    Um das Problem mal einzugrenzen:
    Eine localhost/info.php im root kann ich aufrufen. Klappt.
    Der phpinfo(); Code in der index.html wird “überlesen”. Er erscheint im Quelltext, sonst bleibt er wirkungslos.
    Hmmm?

  9. andy

    Wenn man folgendes in die httpd.conf packt und den Apachen neu startet, klappt es auch mit html-php-parsen:


    <Files ~ "\.html$">
    AddHandler fcgid-script .html
    FcgidWrapper "c:/php/php-cgi.exe" .html
    </Files>

  10. Thomas

    Das Leben kann so schön sein 🙂
    ich war ja in der Zwischenzeit nicht untätig und habe Tante Google befragt. Man stößt auf zahllose Hinweise, und keiner führt zum Ziel. Wenn man bei dem Thema noch in den kinderschuhen steckt und nicht wirklich systematisch nach dem Problem und einer Lösung fahnden kann läuft es auf trail&error hinaus. War schon frustrierend.
    Von daher nochmal einen besonderen Dank, dafür dass du dir die Mühe gemacht hast einem nervigen Kommentator unter die Arme zu greifen.
    Wenn Du deine letzte Antwort jetzt noch in den Artikel einarbeitest, ist auch dem nächsten Ratlosen schnell geholfen.

  11. Thomas

    Moin
    Nachdem ich mich gestern schon freute, heute nun das nächste Problem.
    php in einer index.php wird nicht geparst.
    Ich will gerade phpmyadmin installieren und stelle fest, dass die /setup/index.php nicht richtig interpretiert wird.
    Der php-Code im head wird ungeparst ausgegeben und der html Code im body (soweit noch möglich) abgearbeitet.

    PS: Schönen Vatertag, Bin jetzt auch gleich weg vom PC, wollte das aber noch loswerden 🙂

  12. andy

    Bin mir nicht sicher, ob ich dich richtig verstehen, aber check mal in der http.conf die Zeile 271, wenn sie so aussieht

    DirectoryIndex index.html index.php

    dann werden auch index.php-Dateien verarbeitet.

  13. Thomas

    Deinen Hinweis hatte ich schon umgesetzt, bringt aber nichts.
    Ich versuche es mal anders zu formulieren.
    Apache, php und MySql (alles 64Bit) soweit installiert.
    Im htdocs ist die index.html des Apache inclusive p h p i n f o (); was dank deiner Hinweise richtig abgearbeitet wird. Hier kein Problem!
    Um phpmyadmin zu installieren habe ich im htdocs das Verzeichnis phpmyadmin angelegt und dort hinein die entzipten Datein von phpmyadmin kopiert (alles “streng” nach einschlägigen Anleitungen).
    Eigentlich sollte es mit dem Aufruf des Verzeichnises (localhost/phpmyadmin) im Browser bereits laufen. Leider erscheint nur folgende Meldung “Forbidden You don’t have permission to access /phpmyadmin/navigation.php< on this server."
    Nun gibt es im phpmyadmin Verzeichnis einen Ordner "setup" und darin die Datei "index.php". Aus diversen Installationen von WordPress oder Joomla schließe ich, dass das die Setuproutine für phpmyadmin ist.
    Rufe ich nun dieses Verzeichnis oder direkt die darin enthaltene "index.php" (http://localhost/phpmyadmin/setup/index.php) auf, erscheint im Browser der in der index.php im head Bereich enthaltene php Code im Browserfenster (hier ein Auszug [falls er angezeigt wird] * @license http://www.gnu.org/licenses/gpl.html GNU GPL 2.0 */ /** * Core libraries. */ require './lib/common.inc.php'; $page = filter_input(INPUT_GET, 'page'); $page = preg_replace('/[^a-z]/', '', $page); if ($page === '') { $page = 'index'; } if (!file_exists("./setup/frames/$page.inc.php")) ]
    Der dann im body enthaltene html Code wird geparst. Wobei da nicht viel auf dem Bildschirm steht, außer dem Schriftzug "phpMyAdmin setup", weil vorangegangene php-Befehle ja nicht abgearbeitet wurden.
    Conclusio:
    Der Apache parst den in einer .php Datei enthaltenen php Code (der zwischen php-Tags steht) nicht, sondern gibt ihn als Text im Browserfenter aus.

  14. andy

    Da weiss ich nun auch nicht weiter, da es bei mir funktioniert.
    Prüf’ mal die Logs vom Apache und PHP, allen voran die Error-Logs.

  15. Thomas

    Moin
    Man bin ich stolz auf mich!
    Nach einigem Lesen habe ich einen weiteren (!) Code in der httpd ergänzt.
    Und zwar eine leicht Modifikation deines obigen Vorschlags

    AddHandler fcgid-script .php
    FcgidWrapper “c:/php/php-cgi.exe” .php

    Soweit ich das verstehe wird Apache damit mitgeteilt, dass er alle Files mit der Endung .php auch als solche behandeln soll.
    Damit scheint es zu funktionieren !!!

  16. Thomas

    Mist wieder keine Codewiedergabe.

    AddHandler fcgid-script .php
    FcgidWrapper "c:/php/php-cgi.exe" .php

  17. Thomas

    Files ~ "\.php"
    AddHandler fcgid-script .php
    FcgidWrapper "c:/php/php-cgi.exe" .php
    /Files

  18. andy

    Du meinst das hier:

    <Files ~ "\.php$">
    AddHandler fcgid-script .php
    FcgidWrapper "c:/php/php-cgi.exe" .php
    </Files>

    Und zur Info, wie man Code im Kommentar los wird:

    http://codex.wordpress.org/Writing_Code_in_Your_Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑