Im vergangenen Jahr hat mein Kollege, Jan Schenk, einen wunderbaren Blog-Eintrag geschrieben, in dem er erklärte, wie sich PHP-Anwendungen per FastCGI auf Windows Azure ausführen lassen. Nachdem sich die Windows Azure Platform inzwischen ein wenig weiterentwickelt hat und die Visual Studio Projektvorlagen einige notwendige Schritte vereinfachen, möchte ich an dieser Stelle eine Aktualisierung des Dokuments vornehmen.

Voraussetzungen

Die FastCGI-Erweiterung kann auf Windows 7 wie folgt aktiviert werden: “Windows Start –> Control Panel –> Programs –> Turn Windows features on or off”.  In der “Windows Features”-Maske das Element “Internet Information Services –> World Wide Web Services –> Application Development Features –> CGI��� aktivieren und das Ganze mit OK bestätigen.

PHP01

Schritt 1: Start von Visual Studio mit Administratorrechten (!)

Den Menüpunkt “Windows Start –> All Programs –> Microsoft Visual Studio 2010 –> Microsoft Visual Studio 2010” mit der rechten Maustaste anwählen und “Run as administrator” anklicken. Der Start mit Administratorrechten ist notwendig, um das Projekt später in der Azure Development Fabric starten und testen zu können.

Schritt 2: Anlegen einer Azure Cloud Service Solution

Wählen Sie in Visual Studio den Menüpunkt “File –> New… –> Project…”.

PHP02

Wählen Sie in der Maske New Project den Projekttyp “Windows Azure Cloud Service”, vergeben Sie einen Projektnamen (z.B. PHPService) und bestätigen Sie Ihre Auswahl mit OK.

Fügen Sie im Cloud Service Project Wizard zum Projekt eine CGI Web Role hinzu. Markieren Sie hierzu die Rolle und klicken auf “>”.

PHP03

Bestätigen Sie Ihre Auswahl mit OK.

Schritt 3: Aktivieren der “Native Code Execution”

Stellen Sie sicher, dass in der Datei ServiceDefinition.csdef das Element enableNativeCodeExecution auf true gesetzt ist. Dies sollte, sofern sie oben eine CGI Web Role hinzugefügt haben, bereits der Fall sein. Die entsprechende Datei sieht per Voreinstellung wie folgt aus.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="PHPService" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WebCgiRole" enableNativeCodeExecution="true">
    <InputEndpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="80" />
    </InputEndpoints>
    <ConfigurationSettings>
      <Setting name="DiagnosticsConnectionString" />
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

Schritt 4: Konfiguration des FastCGI-Moduls des Webservers

Öffnen Sie die Datei Web.roleConfig, die von Visual Studio bereits angelegt wurde. In dieser Datei finden Sie im Kommentar bereits eine Anleitung, wie das FastCGI-Modul konfiguriert werden kann. Tragen Sie die Konfigurationsinformation wie folgt ein:

<?xml version="1.0"?>
<configuration>
  <system.webServer>
    <fastCgi>
      <application fullPath="%RoleRoot%\approot\php\php-cgi.exe"/>
    </fastCgi>
  </system.webServer>
</configuration>

Der Pfadbestandteil %RoleRoot%\approot verweist dabei auf das Hauptverzeichnis der CGI Web Role. Die Datei php\php-cgi.exe werden wir dem Projekt im nächsten Schritt hinzufügen.

Schritt 5: Hinzufügen der PHP-Runtime

Laden Sie sich von http://www.php.net/ die für Ihr PHP-Projekt benötigte PHP-Runtime herunter. Zur Erstellung dieses Blog-Artikels habe ich von http://windows.php.net/download/ die Version “VC9 x86 Non Thread Safe (2010-Mar-04 20:11:07)” heruntergeladen, also folgende ZIP-Datei: http://windows.php.net/downloads/releases/php-5.3.2-nts-Win32-VC9-x86.zip.

Entpacken Sie diese Datei zunächst in ein temporäres Verzeichnis. Legen Sie dann in Visual Studio über “Add –> New Folder” in der CGI Web Role ein. Benennen Sie dieses Verzeichnis mit “php”.

PHP04

Kopieren Sie nun den Inhalt der PHP-ZIP-Datei in das php-Projektverzeichnis. Diese Dateien müssen Sie nun noch formal in das Projekt aufnehmen. Lassen Sie sich mit Klick auf die “Show all files”-Schaltfläche

PHP05

alle Projektdateien anzeigen. Markieren Sie nun alle Dateien im php-Verzeichnis, klicken dort mit der rechten Maustaste auf “Include In Project”, um die Dateien ins Projekt aufzunehmen.

PHP06

Dies stellt sicher, dass die PHP-Runtime später auch ordnungsgemäß mit dem Cloud Service paketiert wird.

Schritt 6: Verknüpfung von PHP-Ressourcen mit der PHP-Runtime

Jetzt müssen Sie noch festlegen, dass PHP-Ressourcen (also z.B. *.php-Dateien) von der PHP-Runtime abgearbeitet werden sollen. Öffnen Sie hierzu die Datei Web.config. Im Abschnitt system.webServer finden Sie bereits eine Anleitung, wie diese Verknüpfung konfiguriert werden kann. Fügen Sie folgende Code-Zeilen ein:

<system.webServer>
  <handlers>
    <add name="PHP FastGGI Handler"
      verb="*"
      path="*.php"
      scriptProcessor="%RoleRoot%\approot\php\php-cgi.exe"
      modules="FastCgiModule"
      resourceType="Unspecified" />
  </handlers>
  <defaultDocument>
    <files>
      <add value="index.php"/>
    </files>
  </defaultDocument>
</system.webServer>

Damit haben Sie den PHP FastCGI Handler für alle Ressourcen mit Dateinamenserweiterung php konfiguriert und festgelegt, dass bei Anfragen, die keine konkrete Datei spezifizieren, die Datei index.php verwendet werden soll.

Schritt 7: Programmierung der PHP-Anwendung

Im Grunde sind wir jetzt fertig. Die PHP-Runtime ist in das Projekt integriert und kann PHP-Ressourcen verarbeiten. Erstellen Sie nun abschließend noch eine kleine PHP-Datei. Fügen Sie dem Projekt über “Add –> New Item…” eine neue HTML-Seite hinzu. Benennen Sie diese Datei mit index.php. Die HTML-Datei enthält schon den wichtigsten Code. Nur ein PHP-Aufruf fehlt noch. Fügen Sie diesen wie folgt hinzu:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>PHP mit Windows Azure</title>
</head>
<body>
      <?php phpinfo();?>
</body>
</html>

Dieser Code zeigt einfach die Versionsinformation der PHP-Runtime an.

Schritt 8: Test der Anwendung

Starten Sie die Anwendung mit F5. Dies fährt die Development Fabric hoch, installiert die Anwendung und ruft die Homepage (http://127.0.0.1:81) des aktuellen Projekts auf.

Das Ergebnis sollte wie folgt aussehen:

PHP07

Damit sind wir fertig! Eine – wenngleich sehr simple – PHP-Anwendung läuft in der Azure Development Fabric. Eine Installation auf Windows Azure kann nun wie bei jeder anderen Web Role über das Windows Azure Portal erfolgen.