Vous avez besoin de démarrer rapidement un serveur web pour tester une application PHP ? L’interpréteur PHP en a un intégré ! Vous pouvez l’utiliser pour inspecter rapidement votre travail sans exécuter Apache, NGINX, ou une solution de conteneurisation.

Le serveur intégré de PHP reçoit relativement peu d’attention, mais il est assez puissant pour le développement. Dans ce guide, nous allons montrer comment vous pouvez l’utiliser comme une alternative à d’autres micro-serveurs comme SimpleHTTPServer de Python ou le paquet http-server de npm, qui ne peuvent pas exécuter de scripts PHP.

Qu’est-ce qu’un fichier PHP ?

Utilisation du serveur intégré

Le serveur intégré est un mécanisme pratique pour vous aider à tester des sites PHP dans des environnements qui ne disposent pas d’un serveur HTTP à part entière. Il est disponible dans PHP 5.4 et toutes les versions ultérieures. Vous pouvez l’exécuter directement depuis votre répertoire de travail sans avoir à configurer un hôte virtuel au préalable.

Avant d’utiliser le serveur, sachez qu’il est conçu uniquement pour le développement. La documentation PHP met explicitement en garde contre le déploiement de ce serveur devant des applications de production. Il n’est pas suffisamment sécurisé pour être exposé sur des réseaux accessibles au public.

Démarrer le serveur

Le serveur est démarré en passant l’option -S à l’exécutable php :

$ php -S localhost:8080
[Fri Jun 10 16:00:00 2022] Démarrage du serveur de développement PHP 8.1.5 (http://localhost:8080)

L’argument donné à la commande spécifie l’adresse d’écoute du serveur. Dans l’exemple ci-dessus, nous avons utilisé le port 8080 sur localhost. Vous pouvez maintenant visiter http://localhost:8080 dans votre navigateur web pour accéder au contenu de votre répertoire de travail. Les éventuels scripts PHP seront exécutés automatiquement lorsque vous les demanderez.

Vous pouvez servir un chemin qui se trouve en dehors de votre répertoire de travail en définissant l’option -t lorsque vous démarrez le serveur :

$ php -S localhost:8080 -t /home/$USER/public_docs

La racine du document sera désormais /public_docs dans votre dossier personnel.

Gardez votre fenêtre de terminal ouverte pendant que vous utilisez le serveur web. Appuyez sur Ctrl+C pour tuer le processus une fois que vous avez fini de tester votre site. PHP enregistrera chaque requête entrante dans votre fenêtre de terminal, y compris l’URI et la méthode HTTP. Toute erreur PHP non capturée apparaîtra également dans les journaux.
Activer l’accès à distance

L’écoute sur localhost n’autorise pas les connexions entrantes provenant d’autres appareils sur votre réseau. Vous pouvez autoriser l’accès à distance en vous liant à 0.0.0.0 à la place :

$ php -S 0.0.0.0:8080

Rappelez-vous que le serveur n’est pas renforcé pour une utilisation en production et qu’il ne doit pas être exposé publiquement. N’autorisez l’accès à distance que lorsque c’est absolument nécessaire, par exemple pour tester une fonction particulière sur un appareil mobile. Assurez-vous que le port que vous utilisez n’est pas ouvert à l’Internet.

Correspondance des requêtes de secours

PHP recherche les fichiers index.php et index.html dans la racine du document actif lorsque la requête entrante ne contient pas de composant URI. Si aucun de ces fichiers n’existe, le serveur continuera à remonter l’arborescence des répertoires, à la recherche d’un index dans l’un des parents de votre racine de document. Cela signifie que vous pouvez vous retrouver involontairement à servir du contenu qui se trouve en dehors du répertoire que vous avez spécifié. Un état 404 Not Found sera émis lorsque le sommet de l’arbre est atteint sans qu’un fichier d’index soit trouvé.

Les requêtes qui incluent un URI (tel que /file) doivent correspondre exactement à un fichier statique dans la racine du document. Sinon, un 404 sera renvoyé. PHP définit automatiquement l’en-tête de réponse Content-Type avec le type MIME du fichier servi pour les extensions de fichiers les plus courantes.

Utilisation d’un script de routage

Vous pouvez optionnellement configurer le serveur web pour qu’il appelle un script à chaque requête. Cela vous permet d’utiliser le contrôleur frontal de votre application pour effectuer un routage dynamique avancé.

La fonctionnalité de routage est activée en fournissant un nom de fichier PHP sur la ligne de commande lorsque vous démarrez le serveur :

$ php -S localhost:8080 router.php

PHP utilisera désormais router.php pour traiter toutes les requêtes entrantes. Vous pouvez diriger les utilisateurs vers le point approprié de votre application en inspectant l’URI de la requête :

if ($_SERVER[« REQUEST_URI »] === « /dashboard ») {
require_once(« dashboard.php ») ;
}
else if ($_SERVER[« REQUEST_URI »] === « /profile ») {
require_once(« profile.php ») ;
}
else {
require_once(« 404.php ») ;
}

La sortie produite par votre script de routeur deviendra la réponse qui sera envoyée au client. Il y a une exception si le script renvoie false : dans ce cas, PHP retournera le fichier statique qui correspond à l’URI de la requête originale.

if (str_starts_with($_SERVER[« REQUEST_URI »], « /api »)) {
// Route vers le bon point de terminaison de l’API
// …
}
else {
// Servez d’autres routes de manière statique
Retourner faux ;
}

Détecter le serveur intégré à partir de votre code PHP

Votre code PHP peut détecter s’il est appelé par le serveur web intégré en inspectant le nom de l’interface active. La fonction php_sapi_name() fournit cette valeur. Elle aura la valeur cli-server lorsque le script a été invoqué par le composant serveur intégré.

if (php_sapi_name() === « cli-server ») {
enable_development_mode() ;
}

Gestion de plusieurs requêtes simultanées

Par défaut, le serveur fonctionne en mode synchrone mono-processus. Les requêtes sont traitées individuellement et s’empêchent mutuellement de s’exécuter jusqu’à leur achèvement. C’est l’une des raisons pour lesquelles le serveur n’est pas adapté à une utilisation en production.

PHP 7.4 a ajouté la prise en charge de plusieurs requêtes simultanées. Il s’appuie sur la disponibilité de fork() et ne fonctionne pas sous Windows. Le serveur va forker un nouveau travailleur pour servir chaque requête entrante lorsque ce mode est activé. Vous pouvez l’activer en définissant la variable d’environnement PHP_CLI_SERVER_WORKERS au nombre de workers que vous souhaitez :

$ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080

Cette fonctionnalité est toujours marquée comme expérimentale dans PHP 8.1.

Conclusion

PHP possède un serveur web intégré qui est un moyen pratique de tester vos applications et d’exposer rapidement le contenu du système de fichiers local sur votre réseau local. Il supporte l’exécution de scripts PHP, le routage « catch-all », et les fichiers statiques avec les types MIME les plus courants.

Bien que le serveur supporte maintenant un mode de bifurcation optionnel, il n’est pas conseillé de l’utiliser en production. Il est conçu comme une aide au développement et ne dispose pas des fonctions de personnalisation et de sécurité dont vous aurez besoin pour vos déploiements publics. Là où il excelle, c’est en tant qu’alternative légère et intégrée aux plateformes de développement conventionnelles comme WAMP, XAMPP et les conteneurs Docker.