Il faut dire que la procédure pour le faire n'a rien de bien complexe, puisque qu'il suffit d'appeler le binaire PHP en CLI avec l'option -S
suivi de l'adresse IP et du port sur lequel il doit écouter, de la manière suivante :
# php -S 127.0.0.1:8080
le serveur de PHP se lance alors et indique qu'il attend des requêtes HTTP sur l'adresse IP et le port qui lui ont été passés en argument :
PHP Development Server is listening on 127.0.0.1:8080 in . ... Press Ctrl-C to quit.
Les lecteurs attentifs auront remarqué deux choses :
- La première partie du message est incomplète, puisqu'elle se termine par
, au lieu dein .
, preuve que PHP 5.4 est toujours en cours de développement ;in path/to/current/directory
- Il suffit d'exécuter la combinaison de touches
Ctrl-C
pour arrêter le serveur ;
Le serveur HTTP est donc apparemment bien lancé, et pour le vérifier, il suffit de taper l'URL http://127.0.0.1:8080 dans la barre d'adresse du navigateur de votre choix.
Si tout fonctionne correctement, vous devriez obtenir le résultat suivant, s'il n'y a pas de fichier nommé index.html
ou index.php
dans le répertoire depuis lequel vous avez lancé le serveur :
Not Found
The requested resource / was not found on this server.
De plus, vous devriez avoir la confirmation que votre requête a bien été traitée par le serveur dans votre console, car le message suivant devrait y apparaître :
[Tue Jul 5 13:31:08 2011] 127.0.0.1:51668: / - No such file or directory
[Tue Jul 5 13:31:08 2011] 127.0.0.1:51668: / - Sending error page (404)
En effet, conformément à sa RFC, le serveur web cherche, lorsque l'URL qu'il reçoit correspond à un répertoire sur le système de fichier, un fichier nommé index.html
ou index.php
.
Cependant, la RFC ne précise pas l'extension de fichier prioritaire, et pour savoir à quoi m'en tenir, j'ai donc mis dans le répertoire de démarrage du serveur les fichiers index.html
et index.php
.
Il en ressort que, pour le moment, paradoxalement, le fichier index.html
est prioritaire sur index.php
.
J'ai ensuite mis en concurrence le serveur intégré de PHP avec le serveur web le plus utilisé actuellement, à savoir apache, dans sa version 2.2.12, compilé en mode prefork
.
Pour cela, j'ai défini le répertoire de départ du serveur de PHP vers le répertoire de départ par défaut de mon serveur apache, à savoir /var/www/
, à l'aide de l'option -t
:
# php -S 127.0.0.1:8080 -t /var/www/
J'ai ensuite utilisé l'utilitaire ApacheBench, aka ab, pour envoyer 1000 requêtes concurrentes réparties sur 10 clients pour différents contenus, et cela sur chacun des deux serveurs, apache et le serveur web de PHP écoutant respectivement sur les ports 80 et 8080.
J'ai commencé doucement, en demandant aux deux serveurs d'envoyer le contenu d'un simple fichier HTML, et j'avoue avoir été surpris du résultat, même si le serveur de PHP n'est en aucune manière destiné à la production.
En effet, ce dernier tient la dragée haute à apache, puisque tous deux se sont révélés capables de gérer approximativement le même nombre de requêtes par seconde.
À contrario, en demandant un fichier inexistant, très curieusement, les performances du serveur HTTP de PHP s'effondre par rapport à apache, qui parvient dans ce cas à traiter près de quatre fois plus de requêtes par seconde.
Et curieusement, les résultats du serveur de PHP ne s'améliorent pas dans le cas d'un appel à un fichier PHP ne contenant qu'un simple
, car même si dans ce cas, l'écart entre les deux logiciels se réduit, apache parvient à gérer un peu plus du double de requêtes par seconde par rapport à PHP.<?php echo uniqid(); ?>
Les résultats ont cependant fini par s'équilibrer lorsque j'ai testé du code de production correspondant à une application basée sur Symfony 1.4 et conçue et distribuée par mon employeur PMSIpilot.
Dans ce cas de figure, le serveur intégré de PHP s'est même permis de faire mieux que son adversaire, en parvenant à gérer quelques requêtes supplémentaires par seconde.
Il est donc difficile de tirer une leçon de ces tests puisque les résultats sont relativement contrastés suivant les différents contextes de mise en œuvre et que j'ai de toute façon voulu comparer des choses incomparables.
En effet, apache est destiné à la production alors que le serveur de PHP est un outil de développement, et il n'est donc pas logique de comparer un outil taillé pour supporter des contraintes de mise en œuvre potentiellement fortes avec un autre qui ne l'est pas, un environnement de développement étant par définition beaucoup plus léger qu'un environnement de production.
Et reste indépendamment de ses performances, le serveur HTTP de PHP 5.4 remplit parfaitement son contrat, qui est de permettre au programmeur de disposer à moindre frais et très rapidement d'un serveur HTTP pleinement fonctionnel pour ses développements, et non d'offrir des performances extraordinaires ou au moins équivalentes à d'autres solutions.
Sa mise en œuvre est en effet extrêmement simple, ne demande aucune configuration ni installation, et il fourni via la console une trace compréhensible et exploitable de l'ensemble des requêtes qu'il reçoit.
19 réactions
1 De Amaury - 05/07/2011, 14:41
Très intéressant. Merci pour ce retour.
Question idiote, juste par curiosité : J'ai bien compris que ce serveur HTTP n'était prévu que pour le développement. Mais qu'est-ce qui le limite au dév, au final ? Qu'est-ce qui le rend intrinsèquement incapable de gérer une plate-forme de production, techniquement parlant ?
2 De mageekguy - 05/07/2011, 14:42
@Amaury : Sans réfléchir plus à que cela à la question, je peux déjà te dire que s'il se plante pour une raison ou pour une autre, plus rien n'écoute sur l'interface (pas de fork, thread, etc.).
Bon, tu vas me sortir l'argument
inetd
, mais bon... on va dire que je ne vais pas l'entendre dans ce contexte ;).Je ne peux pas te répondre plus en détails, car je n'ai pas mis le nez dans l'implémentation, mais rien que ce que j'ai indiqué plus haut suffit pour le disqualifier en production, de toute façon.
3 De Paul - 05/07/2011, 14:49
Très intéressant comme article.
Tu parles de tests avec Symfony, dans la configuration d'apache pour un project Symfony, on a souvent besoin de virtualhost et d'alias ( /sf )
C'est possible avec le serveur intégré de faire des alias ?
4 De naholyr - 05/07/2011, 21:43
Excellent outil, et très bonne nouvelle qu'il soit bien performant Ça veut dire que la machine de dév ne souffrira d'aucune manière en faisant tourner les scripts d'une manière ou d'une autre.
Pourquoi uniquement un outil de dév ? Je dirais naïvement "parce qu'il est fait pour ça". Et ce n'est pas si naïf finalement, en effet un outil qui a été développé dès le départ dans l'optique "plateforme de développement" ne se fixe pas les mêmes contraintes, notamment en terme de robustesse et de sécurité. Alors il peut être très performant, mais il aura sûrement des comportements inattendus, des crash anecdotiques, chose inadmissible pour de la prod mais tout-à-fait tolérable en dév. Peut-être que dans l'avenir l'outil changera d'optique, mais en attendant rien que son positionnement le disqualifie
5 De mageekguy - 05/07/2011, 22:07
@Paul : La RFC indique que tu peux passer au serveur web lors de son lancement un script PHP qui peut se charger de faire le routage.
Cependant, n'ayant pas testé cette fonctionnalité, j'ai préféré ne pas en parler dans le cadre de ce billet, d'autant que ce n'était pas son objet.
6 De grunk - 05/07/2011, 22:23
J'avoue ne pas bien saisir l'intérêt d'un tel serveur web. L'argument que tu évoques dans ton article n'a pas vraiment de sens. Quel développeur prendrait le risque de développer sur une plateforme complètement différente de la plateforme finale ?
Quand bien même ce ne serait pas un problème, les stacks lamp/xamp/mamp sont tellement facile à installer que encore une fois je trouve pas ce serveur intégré très pertinent.
Après effectivement pour un développement très ponctuel pourquoi pas ...
7 De Fred - 05/07/2011, 23:48
A priori une bonne nouvelle si ça aide par exemple au déboggage dans un premier temps... par contre apres c'est vrai que j'aurai tendance a préférer être sur le même type de serveur entre un serveur de développement et de production pour pas avoir de mauvaises surprises ... Qu'en est-il aussi de l'intégration avec mysql, postgresql,... ? A mon avis il restera dédié au développement tant qu'il n'aura pas acquis la maturité suffisante pour ne pas connaitre de problème qui risqueraient de le discréditer (charge, sécurité, ...) ...autant dire que que ce n'est pas pour demain !
8 De mageekguy - 06/07/2011, 00:26
@Fred : Je pense que tu n'as pas compris que ce serveur ne sera JAMAIS destiné à la production et son champ d'application est précisément le développement.
On s'en tamponne donc à un point inimaginable des éventuels problèmes de sécurité, et même des performances (je force intentionnellement le trait pour que le message passe, vu que cela semble difficile).
Quand à l'argument de dire que ce n'est pas une bonne pratique de développer sur autre chose que le serveur HTTP qui sera finalement utilisé, c'est ne pas voir plus loin que le bout de sa propre lorgnette.
En effet, suivant le projet, le code peut être amené à être exécuté sur plusieurs configurations très différentes, que ce soit au niveau de l'OS, du serveur HTTP ou de la SAPI PHP (CGI, mod_php, FastCGI, FPM, j'en passe et des meilleurs).
Alors certes, si le code est destiné à tourner sur une plate-forme précise, utiliser le même serveur dans la même configuration est une bonne pratique, mais dans les faits, cela arrive relativement rarement, et même dans ce cas, étant donné qu'il n'est pas possible de prédire l'avenir, personne ne peut dire que cela n'arrivera vraiment jamais.
De plus, ce qui fait la différence entre deux serveurs web sont les performances et la facilité de configuration, et non leur implémentation de HTTP.
Le contexte est donc très différent de celui de Javascript, par exemple, qui, même s'il est normalisé, a des comportements bien différents suivant les navigateurs.
Évidement, il peut y avoir besoin de fonctionnalités spécifiques dans certain cas, comme les rewrites rules d'apache, et donc dans ce cas, le serveur web intégré de PHP ne peut être utilisé pour le développement (encore que cette fonctionnalité puisse certainement être émulée), mais là encore, il ne faut pas croire que ce cas de figure soit très répandu.
Enfin, je vois mal ce que vient faire mysql ou postgresql dans l'équation à ce niveau, vu que ces logiciels sont indépendant du serveur web.
Et évite le
dans tes commentaires à l'avenir s'il te plaît ;).9 De Nicolas Laforêt - 06/07/2011, 08:26
Hello,
Est-il prévu des outils particuliers sur ce serveur ? Du genre débugger intégré ou autres joyeusetés qui pourraient être sympa, vu que c'est un serveur de dev, avoir des outils non disponibles ou difficile à paramétrer, ce serait sympa. Je ne dis pas que xdebug est difficile a paramétrer par exemple, mais dans l'esprit du serveur intégré, un debugger intégré semble approprié, ou un profiler pour benchmarker les scripts .... enfin moi je trouve l'idée séduisante ^^
Bonne journée
10 De mageekguy - 06/07/2011, 09:25
@Nicolas Laforêt : Je n'ai rien vu à ce sujet pour le moment.
Le serveur web intégré est quelque chose de nouveau, et il ne fait pas l'unanimité parmi les contributeurs, que ce soit au niveau de son utilité ou de la façon dont il est implémenté.
Et pour l'instant, c'est également un nid à bugs.
Il est donc prématuré d'envisager l'avenir, étant donné que le présent n'est même pas encore clairement défini.
Ce qui est par contre certain, c'est que cette fonctionnalité suscite l'enthousiasme.
11 De Olivier Laviale - 06/07/2011, 09:54
Pareil que @grunk. Est-ce que le serveur intégré gère les hôtes virtuels ? S'il écoute sur un port, j'imagine que non. Au boulot, tous nos projets sont accessibles en tant que sous domaines de notre domaine de dev, et chez moi ils sont accessibles en tant que sous domaines de "localhost", alors je vais rester avec Apache encore un moment. "$sudo aptitude install apache2" fastoche !
12 De mageekguy - 06/07/2011, 10:26
@Olivier Laviale : Vu que tu le gère manuellement et que tu peux lui spécifier son répertoire de travail, la notion d'hôte virtuel n'a pas d'intérêt dans le cas du serveur HTTP de PHP 5.4.
Il te suffit de le lancer sur le port de ton choix et le répertoire adéquate, et tu pourras parfaitement te passer d'apache.
Parce que je suis d'accord avec le fait que faire une installation d'apache n'est pas forcément la chose la plus difficile au monde, mais il reste tout de même à le configurer, et je ne parle même pas de la bande passante et des autres ressources consommée inutilement pour remplacer une solution intégrée parfaitement fonctionnelle et extrêmement simple à utiliser.
Franchement, j'ai vraiment du mal à voir l'intérêt qu'il y aura à encore installer apache, en dehors des cas particuliers qui demanderaient une fonctionnalité particulière de tel ou tel serveur HTTP.
13 De Olivier Laviale - 06/07/2011, 12:14
La bande passante n'est pas vraiment une préoccupation lorsque je travaille en local, et l'utilisation des ressources par Apache est négligeable. De plus, comme le dis @grunk, je préfère travailler dans un environnement semblable à celui de production.
D'après tes tests les performances ne sont pas non plus au rendez-vous. Le temps passé sur l'intégration du serveur ne serai-t-il pas mieux dépensé sur le langage lui-même (syntaxe plus simple pour les tableaux ? intégration de runkit ?).
14 De mageekguy - 06/07/2011, 14:09
@Olivier Laviale : Tu as un dépôt Debian en local ?
Et tu serais bien le premier qui aurait un apache qui ne consomme pas de ressources.
Quand aux performances, en local, avec un unique client qui fait une requête toutes les minutes (si tant est que tu rafraichis ta page à ce rythme, ce qui m'étonnerait énormément), je ne vois pas en quoi les performances d'un serveur HTTP sont un facteur à prendre en compte dans l'environnement de développement.
Maintenant, si tu préfères faire ton installation et ta configuration juste pour ne pas utiliser une solution plus simple, fonctionnelle et disponible nativement, libre à toi.
HTTP serait supporté par les serveurs HTTP de la même manière que Javascript par les navigateurs, je pourrais comprendre ce besoin d'avoir en développement le même serveur que celui de destination (voir même la totalité des serveurs HTTP du marché).
Cependant, le support d'HTTP est uniforme entre les serveurs, et heureusement, d'ailleurs, sinon le Web ne serait pas tel qu'il est.
D'ailleurs, qui peut savoir à l'avance sur quel serveur HTTP son code sera amené à être exécuté ?
Encore une fois, les développements spécifiques à un serveur HTTP sont largement plus l'exception que la règle, ne serait-ce que par la nature même du web.
Quand à la
, le patch existe depuis des mois, et il y a bien longtemps que les développeurs sont passés à autre choses.De plus, ce serveur est une contribution d'un développeur qui participe assez peu au développement du langage en lui-même.
L'ajout de cette fonctionnalité a donc eu un impact négligeable sur la disponibilité des ressources.
Et de toute façon, chaque développeur est indépendant et travaille sur ce qui lui plaît et en fonction de ses disponibilités.
C'est d'ailleurs ce qui a tué PHP 6.
15 De Nami - 06/07/2011, 18:18
Il faudra que je fasse mes tests !
Légère erreur sinon : "Pour ceux qui ne le saurait"
16 De Olivier Laviale - 06/07/2011, 22:08
J'aime bien ta conclusion Pour en revenir à "l'utilisation négligeable des ressources" je parlais bien sûr d'une utilisation en local. Je ne sais pas ce que cela représente sur le serveur de Nintendo. De toute façon, je reste fidèle à Apache, comme ça je peux jouer avec Ruby en même temps
17 De Nicolas Laforêt - 08/07/2011, 10:20
Ok, c'est vrai que ce serveur est encore en stade alpha, mais ces perspectives d'évolutions sont intéressantes.
Dommage qu'il n'y ai rien de prévu autour de PHP 5.4 pour le PHP Tour de Lille.
18 De Matthieu - 10/07/2011, 22:40
En local, j'ai l'habitude d'installer un LAMP/WAMP/MAMP. Je vais donc préférer cette solution tout en un, plutôt que de m'embeter à télécharger et installer PHP + MySql + PhpMyAdmin manuellement. Bref, ça ne me semble pas utile.
De plus, l'idée d'avoir un serveur intégrée au langage PHP, ça me semble aussi logique que d'avoir un serveur MySql d'intégré à PHP... C'est à dire, pas très pertinent. À la limite, proposer une version PHP au téléchargement qui intègre directement un serveur HTTP (apache ou autre), automatiquement configuré pour du dev. Une sorte de PHP-dev quoi. Tiens, ça ressemble un peu à WAMP tout ça... Bref, on tourne en boucle. Et perdre du temps à redévelopper un nouveau serveur HTTP... Ils auraient mieux fait d'en utiliser un existant.
L'article et le test étaient en tout cas très intéressants.
19 De arnolem - 12/03/2012, 14:31
Pour ma part, je ne pense pas que ce serveur intégré permette réellement d'être utilisé en tant que serveur de développement tout simplement parce qu'il ne sera jamais utilisé en production. Si le serveur de production est du Linux/Apache, les développements ne doivent pas être fait sous Windows/PHP5.4-server.
A la limite, il peut être utile pour lancer un test ou un petit script pour ceux qui n'aime pas utiliser PHP en CLI.