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 est assez puissant à des fins de développement. Dans ce guide, nous montrerons comment vous pouvez l’utiliser comme alternative à d’autres micro-serveurs comme SimpleHTTPServer de Python ou le package http-server npm, qui ne peuvent pas exécuter de scripts 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 dépourvus 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 à partir de votre répertoire de travail sans avoir à configurer d’abord un hôte virtuel.
Avant d’utiliser le serveur, sachez qu’il est conçu à des fins de développement uniquement. 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émarrage du serveur
Le serveur est démarré en passant le -S
drapeau à la php
exécutable :
$ php -S localhost:8080 [Fri Jun 10 16:00:00 2022] PHP 8.1.5 Development Server (http://localhost:8080) started
L’argument donné à la commande spécifie l’adresse d’écoute du serveur. Nous avons utilisé le port 8080
sur localhost
dans l’exemple ci-dessus. Vous pouvez maintenant visiter http://localhost:8080
dans votre navigateur Web pour accéder au contenu de votre répertoire de travail. Tous les 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 le -t
drapeau au démarrage du serveur :
$ php -S localhost:8080 -t /home/$USER/public_docs
La racine du document sera désormais /public_docs
dans votre dossier personnel.
Gardez la fenêtre de votre terminal ouverte pendant que vous utilisez le serveur Web. Appuyez sur Ctrl + C pour tuer le processus une fois que vous avez terminé 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. Toutes les erreurs PHP non détectées apparaîtront également dans les journaux.
Activation de l’accès à distance
Écoute sur localhost
n’autorisera pas les connexions entrantes d’autres appareils sur votre réseau. Vous pouvez autoriser l’accès à distance en vous liant à 0.0.0.0
Au lieu:
$ php -S 0.0.0.0:8080
N’oubliez pas que le serveur n’est pas renforcé pour une utilisation en production et ne doit pas être exposé publiquement. N’autorisez l’accès à distance que lorsque cela est absolument nécessaire, par exemple lors du test d’une fonctionnalité particulière sur un appareil mobile. Assurez-vous que le port que vous utilisez n’est pas ouvert à Internet.
Demander une correspondance de secours
PHP recherchera index.php
et index.html
fichiers dans la racine du document actif lorsque la demande 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 la racine de votre document. Cela signifie que vous pouvez involontairement diffuser 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’arborescence est atteint sans qu’un fichier d’index soit trouvé.
Les requêtes qui incluent un URI (comme /file
) doit correspondre exactement à un fichier statique à la racine du document. Sinon, un 404 sera renvoyé. PHP définit automatiquement le Content-Type
en-tête de réponse au type MIME du fichier servi pour les extensions de fichier les plus courantes.
Utilisation d’un script de routeur
Vous pouvez éventuellement configurer le serveur Web pour appeler 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 routeur 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
gérer tous demande entrante. Vous pouvez acheminer 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 renvoyée au client. Une exception est si le script retourne false
: dans ce cas, PHP retournera le fichier statique qui correspond à l’URI de la requête d’origine.
if (str_starts_with($_SERVER["REQUEST_URI"], "/api")) // Route to the correct API endpoint // ... else // Serve other routes statically return false;
Détection du 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 php_sapi_name()
fonction fournit cette valeur. Il sera réglé sur cli-server
lorsque le script a été appelé par le composant serveur intégré.
if (php_sapi_name() === "cli-server") enable_development_mode();
Traitement simultané de plusieurs demandes
Le serveur s’exécute par défaut en mode synchrone à processus unique par défaut. Les requêtes sont traitées individuellement et s’empêchent mutuellement de s’exécuter jusqu’à ce qu’elles soient terminées. 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 la gestion simultanée de plusieurs requêtes. Il s’appuie sur fork()
disponibilité et ne fonctionne pas sous Windows. Le serveur bifurquera un nouveau travailleur pour servir chaque demande entrante lorsque ce mode est activé. Vous pouvez l’activer en réglant le PHP_CLI_SERVER_WORKERS
variable d’environnement au nombre de nœuds de calcul souhaité :
$ PHP_CLI_SERVER_WORKERS=8 php -S localhost:8080
Cette fonctionnalité est toujours marquée comme expérimentale dans PHP 8.1.
Sommaire
PHP dispose d’un serveur Web intégré qui constitue 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 prend en charge l’exécution de scripts PHP, le routage fourre-tout et les fichiers statiques avec les types MIME les plus courants.
Bien que le serveur prenne désormais en charge un mode fork facultatif, 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 fonctionnalités 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 plates-formes de développement conventionnelles telles que les conteneurs WAMP, XAMPP et Docker.