Comment tester rapidement des sites Web avec le serveur Web intégré de PHP

Publié: 2022-08-11

Illustration montrant le logo PHP

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 drapeau -S à l'exécutable php :

 $ php -S localhost:8080
[Ven 10 juin 16:00:00 2022] Le serveur de développement PHP 8.1.5 (http://localhost:8080) a démarré

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 l'indicateur -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 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

L'é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 à la place :

 $ 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 les fichiers index.php et index.html dans la racine du document actif lorsque la requête entrante n'a 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 (tel que /file ) doivent correspondre exactement à un fichier statique dans la racine du document. Sinon, un 404 sera retourné. PHP définit automatiquement l'en-tête de réponse Content-Type sur le 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 pour gérer chaque requête 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" ] === "/tableau de bord" ) {
    require_once ( "tableau de bord.php" ) ;
}
sinon si ( $_SERVER [ "REQUEST_URI" ] === "/profil" ) {
    require_once ( "profil.php" ) ;
}
sinon {
    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 renvoie 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" ) ) {
    // Routage vers le point de terminaison d'API correct
    // ...
}
sinon {
    // Servir d'autres routes de manière statique
    retourne faux ;
}

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 fonction php_sapi_name() fournit cette valeur. Il sera défini 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 repose sur la disponibilité de fork() 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 définissant la variable d'environnement PHP_CLI_SERVER_WORKERS sur le 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.

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 comme les conteneurs WAMP, XAMPP et Docker.