Enthusiast Geek, Author, Speaker, Traveler, Mountains Lover, Runner and Trailer... I will try to share the best of my journeys with you!

Installation de PHP 5.3 sur du IIS 7.0 (Windows Server 2008)

Lors des MSDays j’ai présenté un sujet intitulé “Héberger vos applications PHP sur plateforme Microsoft”. Il n’y a pratiquement pas de tutorial sur le Web de comment faire ça facilement en français. Surtout qu’avec le support de FastCGI en natif avec Windows Server 2008, il faut en profiter. PHP exploite le Worker de IIS comme ce que fait une application .NET ou Static ! Il y a d’ailleurs beaucoup d’améliorations avec IIS 7.5 et FastCGI. Je vous invite à lire tous les articles sur http://iis.net/

Je vais donc vous montrer qu’en 5 minutes on peut faire tourner du PHP sur du Windows. Voici les différentes étapes :

1°) Préparation du Windows Server

J’ai un Windows Server 2008 (ou 2008 R2 avec IIS 7.5 mais je pourrai également télécharger l’extension FastCGI pour du Windows Server 2003) vierge. Je vais m’assurer que mon fuseau horaire est correct, que j’ai appliqué les différentes mises à jour Windows via Windows Update, que j’ai désactivé la sécurité avancée d’IE (qui est très chiante). Bref le minimum à faire.

2°) Installation de IIS

Via la console Server Manager, je vais ajouter le rôle IIS et rajouter la case CGI lors de la sélection des fonctionnalités IIS. Le CGI est la seule fonctionnalité nécessaire pour permettre d’exécuter du PHP sur du Windows. On peut également le faire sur un Windows Vista ou 7 pour un environnement de développement !

image

3°) Téléchargement des sources / installers de PHP

Je vais sur http://windows.php.net/ puis je télécharge la version qui m’intéresse (sachant que IIS permet d’exécuter plusieurs versions de PHP sur le même serveur). Dans mon cas je vais télécharger le Zip et également l’Installer de PHP 5.3. Vous pouvez également prendre la 5.2.11.

 

image

4°) Installation de PHP sur Windows

Je me retrouve donc avec 2 fichiers car il y a 2 façons d’installer PHP sur Windows.

image

La première est l’archive, j’aurai alors 2 fichiers php.ini, un pour la production et un pour le développement et il faudra que je configure le Handler Mapping de IIS tout seul. Sinon j’ai l’installer de PHP qui me fait ça tout seul. Je suis feignant, je vais donc choisir l’installer. Je lance l’exécutable :

La page de bienvenu :

clip_image001

 

Les accords de licence :

 

clip_image002

 

Et la fenêtre qui nous permet de choisir IIS, ce qui configurera automatiquement le Handler Mapping de IIS

 

clip_image003

 

Ici on peut configurer les variables d’environnement pour que les pages PHP soit interprétées par l’exécutable php-win.exe. On peut également activer d’autres extensions. Je laisse tout par défaut mais je vais installer le manuel PHP car ça sert toujours.

clip_image004

On lance l’installation :

clip_image005

Et c’est terminé.

clip_image006

 

On peut maintenant lancer la console IIS et vérifier le Handler Mapping :

image

J’ai bien une entrée supplémentaire appelée PHP_via_FastCGI. On peut double cliquer dessus pour voir le détails du Mapping. On va simplement faire comprendre les pages PHP à IIS, appeler le module FastCGI qui a été ajouté grâce à la fonctionnalité CGI puis charger l’exécutable php-cgi.exe qui est dans le dossier d’installation de PHP. D’ailleurs à propos de ce dossier d’installation, il peut être plus judicieux de le déporter sur une autre partition que la partition système…

Si j’avais choisi l’installation en passant par l’archive PHP, j’aurai du cliquer sur “Add Module Mapping” et renseigner ces différents champs.

 

5°) Modification du fichier php.ini

Le fichier php.ini est dans le dossier d’installation de PHP. On va utiliser Notepad, l’éditeur par défaut, pour l’ouvrir. L’installer de PHP m’ajoute les paramètres essentiels pour exécuter du PHP dans le fichier PHP.ini mais il en manque quand même. Il ne le fait pas très proprement en plus de cela car s’il le faisait proprement il n’aurait qu’à dé-commenter les bonnes lignes et changer les valeurs. Ici il rajoute un bloc de paramètres dans le fichier comme ça :

image

On pourrait le faire proprement directement avec l’installation en passant par l’archive Zip. Donc ici on va laisser les paramètres :

  • cgi.force.redirect=0 => Pour la sécurité, forcé par défaut de toute façon.
  • fastcgi.impersonate=1 => Pour la sécurité IIS et CGI.
  • extension_dir=”C:\Program Files (x86)\PHP\ext” => là où sont stockés mes fichiers DLL, les extensions PHP.

et on va activer les paramètres suivants, dé-commenter la ligne (ctrl + F pour rechercher avec Notepad) :

  • open_basedir = C:\inetpub => pour spécifier le dossier ou seront stockés mes fichiers PHP (emplacement par défaut avec IIS 7.x). La bonne pratique est bien évidemment d’externaliser ces pages sur un autre disque, comme ce qui est le cas pour les logs IIS.
  • cgi.fix_pathinfo = 1 => pour régler des problèmes de chemin. Une grosse évolution 🙂
  • date.timezone = Europe/Paris => le fuseau horaire qui doit être matché avec celui de votre OS. Cela permet d’éviter les erreurs 500 dans IIS.

La configuration du fichier php.ini est terminée, je sauvegarde le fichier. Nous allons pouvoir créer un fichier PHP et tester que PHP fonctionne bien sur IIS !!!

6°) Création d’un fichier PHP et test

Je me rends donc dans le dossier C:\inetpub\wwwroot\ et je crée un fichier que j’appelle phpinfo.php

image

Je vais ensuite l’éditer et faire un petit phpinfo, du vrai développement pour un IT. J’ouvre le fichier avec Notepad bien évidemment !

image

J’enregistre et je vais pouvoir ouvrir mon navigateur favoris, c’est à dire Internet Explorer 8 et vérifier que PHP a été exécuté sur mon serveur.

image

Si je ne suis pas un développeur de génie … 😉

Bon on peut faire tout ça en mode Geek en passant par une invite de commandes Windows (pkgmgr pour IIS puis appcmd pour le Handler Mapping).

 

Les bonnes pratiques avec PHP

Il y a quelques bonnes pratiques à respecter. Le premier est le compte de service qui est utilisé pour l’Application Pool, soit utiliser un des comptes par défaut de Windows, soit créer un compte de service pour des configurations plus complexes. A vous de voir en fonction de vos besoins. Ensuite la bonne pratique est d’utiliser une application pool par site.

On peut également jouer avec les paramètres du PHP.ini :

Valeur

Description

register_globals=Off

Désactiver les register_globals.

open_basedir="c:\inetpub"

Restreindre où les processus PHP peuvent lire et écrire sur le disque système.

safe_mode=Off
safe_mode_gid=Off

Désactiver le mode safe.

max_execution_time=30
max_input_time=60

Limiter le nombre d’exécution des scripts.

memory_limit=16M
upload_max_filesize=2M
post_max_size=8M
max_input_nesting_levels=64

Limiter l’usage de la mémoire et la taille des fichiers.

display_errors=Off
log_errors=On
error_log="C:\path\of\your\choice"

Configurer les messages d’erreurs et le logging.

fastcgi.logging=0

Le module FastCGI de IIS échoue quand PHP envoie des données sur stderr en utilisant le protocole FastCGI. Désactiver le logging va empêcher que PHP envoie des informations d’erreurs sur stderr, et générant des erreurs 500 sur le client.

expose_php=Off

Cacher la présence de PHP.

allow_url_fopen=Off
allow_url_include=Off

Désactiver les URL à distance pour les fonctions de manipulation de fichiers, ce qui pourrait causer des vulnérabilités d’injection de code.

 

Dernier truc, vous pouvez installer l’Admin Pack pour IIS qui vous rajoute un icone dans la console IIS ‘”FastCGI Settings”. Vous pourrez alors optimiser et configurer différents paramètres tel que le nombre de requêtes CGI maximales.

 

Exécuter plusieurs versions de PHP sur le même serveur :

Ca vous tente de faire tourner plusieurs versions de PHP sur le même serveur ? C’est possible et complètement supporté. En mode geek et très rapide, on va créer 3 sites, chacun de ces sites exécutant une version de PHP différente :

C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath=’c:\php448\php.exe’]
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath=’c:\php5211\php-cgi.exe’]
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath=’c:\php53\php-cgi.exe’]

On a maintenant 3 sites et on va configurer le handler mapping pour ces 3 sites :

C:\>%windir%\system32\inetsrv\appcmd set config site1 –section:system.webServer/handlers /+”..[name=’PHP448_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php448\php.exe’,resourceType=’Either’]
C:\>%windir%\system32\inetsrv\appcmd set config site2 –section:system.webServer/handlers /+”..[name=’PHP521_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php5211\php-cgi.exe’,resourceType=’Either’]
C:\>%windir%\system32\inetsrv\appcmd set config site3 –section:system.webServer/handlers /+”..[name=’PHP525nts_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php53\php-cgi.exe’,resourceType=’Either’]

Ok c’est un peu geek mais on pourrait le scripter et automatiser toute la procédure 🙂

 

Conclusion

C’est plutôt génial tout ça. On pourrait également préparer nos fichiers XML pour déployer n versions de PHP sur le même serveur, ce qui ressemblerait à :

<system.webServer>
    <handlers accessPolicy="Read, Script">
        <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP53\php-cgi.exe|-d open_basedir=C:\Websites\Website1" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
</system.webServer>

On peut également exploiter les fonctionnalités de réécriture d’URLs avec des applications PHP. Bref on peut aller très loin. Il y a d’ailleurs le Windows Cache Extension pour PHP qui est en version RC depuis peu, je vous invite à le tester (ici => wincacheforphp)
Voici d’ailleurs quelques articles à lire:

WINCACHE 1.0 RC – New cool features
WINCACHE 1.0 RC – Using the statistics page
Windows Cache Extension 1.0 for PHP – RC

Sources et quelques liens:
http://learn.iis.net/page.aspx/246/using-fastcgi-to-host-php-applications-on-iis-70/
Installing PHP on Windows Vista with FastCGI
Installing FastCGI Support On Server Core
Using FastCGI to Host PHP Applications on IIS 6.0

William
Follow me!

William

Pre-Sales Engineer chez VMware France
I'm passionate about computing and new technologies since my childhood. I have a very broad and deep knowledge in IT. I'm specialized on the End User Computing solutions, especially on Microsoft, Citrix and VMware technologies.

Otherwise, I'm lucky to fill the rest of my life with activities brimming with interest and passion, practicing sports such as running/trail, hiking in mountains as soon as I can, traveling around the world, and meeting new people.

Feel free to join my LinkedIn profile (https://www.linkedin.com/in/williambories).
William
Follow me!