Dans cet article, nous allons comparer de la manière la plus objective possible deux langages et technologies de programmation pour la réalisation d’un site web ou d’une application web.
L’idée est de comparer les deux solutions Open Source et gratuites d’un point de vue décideur et développeur afin d’essayer d’y voir plus clair. A minima, connaitre les points forts et les points faibles.
Pour les deux langages, nous prendrons les versions à jour en 2014, c’est-à-dire JAVA 8 et PHP 5.5, nous concentrant sur les raisons d’un choix en 2014 (où nous écrivons ces lignes). Nous partirons du principe que nous n’avons pas d’historique et que nous pouvons partir d’une feuille blanche pour notre choix.
Nous allons comparer différents points et essayer de trancher pour chaque point. Nous commencerons par la comparaison des langages en tant que tel. Puis, nous comparerons les frameworks de développement de chaque côté, la facilité de maintenance et d’évolutivité, les performances et enfin d’un point de vue organisationnel.
Dans cette section, nous allons comparer point par point, les caractéristiques des deux langages afin de savoir de quoi il est question. Les autres points dépendent des goûts et aspirations de chacun.
Critère | JAVA | PHP |
---|---|---|
Paradigme | Orientée objet, structurée, impérative | Impératif, objet, fonctionnel, procédural, réflexif. Langage interprété |
Typage | Statique, fort, sûr, nominatif | Dynamic, Faible |
Version | 8 | 5.5.11 |
Compatibilité ascendante | OUI | Pas toujours |
Multiplateforme | OUI | OUI |
Type d’application cible | Toutes | Web |
Gestion UTF-8 | OUI | Partielle |
Slogan | Write once, run anywhere (WORA) | PHP is a popular general-purpose scripting language that is especially suited to web development. |
Popularité (selon l’index TIOBE) | 16,9% | 3,38% |
Dynamisme (selon l’index TIOBE) | -0,01% | -2,4% |
Pré-requis | Une JVM | Un interpréteur PHP et un serveur web (Souvent Apache) |
Lourdeur de mise en place | Moyen | Faible |
Environnement de développement | Eclipse, IntelliJ, NetBeans, JDeveloper… | Simple éditeur de texte, ou IDE intégré |
Généralement pour structurer et accélérer le développement, l’utilisation de frameworks est requise. Que ce soit en JAVA ou en PHPLangage de programmation s’exécutant côté serveur et permettant la création dynamique de pages web ou d'APIs., il existe de nombreux framework très utilisés. En JAVA, on retrouve JEE et SPRING, en PHP majoritairement, ZEND et Symfony.
Nous allons donc essayer de comparer les approches même si celle-ci sont très différentes.
Critère | JAVA JEE (ou SPRING) | PHP Seul (sans framework) | PHP ZEND ou Symfony |
---|---|---|---|
Réaliser une application WEB | OUI | OUI | OUI |
Comptabilité ascendante | OUI | OUI (sans changement de version majeure) | OUI (sans changement de version majeure) |
Nécessite un serveur d’application autre qu’un serveur WEB | OUI | NON | NON |
Supporté par un éditeur principal | OUI (Oracle société privée mais responsable du langage JAVA) | OUI | NON |
Version | 7 / 4.0.5 | 5.5 | 2.3.1 / 2.4.4 |
En terme de maintenance, il est difficile de comparer les deux. En effet, un bug dans PHP est moins bloquant qu’un bug en JAVA / JEE. Pourquoi ?
Essentiellement car un bug dans un traitement JAVA arrête le traitement, là où un bug en PHP peut juste bloquer un peu l’affichage.
Néanmoins lorsqu’un bug est détecté, est-il plus facile de le corriger en PHP ou en JAVA ? Tout dépend bien sûr de la structure et la qualité du développement, mais il s’avère à l’expérience qu’un bug PHP est plus pernicieux et plus difficile à cerner essentiellement car la qualité des logs est plus faible que celle présente en JAVA.
Qui plus est, le langage PHP n’étant pas compilé, un certain nombre de bugs ne se présenteront que lors de l’exécution. La phase de compilation JAVA permet elle d’en supprimer un grand nombre avant qu'ils ne se produisent.
Il n’existe pas à proprement parler de packaging d’application PHP. Une application PHP n’est ni plus ni moins qu’un ensemble de fichiers déposé dans un répertoire. La mise à jour d’une application PHP se révèle élémentaire par l’écrasement des fichiers précédents avec la version récente. L’inconvénient principal de cette approche est qu’il est plus difficile de savoir si la mise à jour s’est bien effectuée. Il faut en effet vérifier chaque fichier. Un autre avantage de cette technique est que l’intégralité des modifications sont tout de suite disponibles et qu’il n’y a pas besoin de livrer toute l’application pour la mettre à jour, un simple « patch » suffit généralement pour réaliser la mise à jour.
JAVA JEE adopte une approche différente avec le packaging de l’intégralité des fichiers au sein d’un seul et même fichier, fichier WAR. Cette archive (ni plus ni moins qu’un fichier ZIP) possède un descripteur de déploiement ainsi que la possibilité de bien numéroter la version. La livraison d’une application se fait donc par la copie d’un seul et unique fichier. Là aussi, le revers de la médaille est qu’il faut livrer tous les fichiers inclus dans le WAR et, de fait, transférer sur le serveur des archives qui peuvent être assez lourdes (de quelques méga, à plusieurs dizaines de méga). Dernier « défaut » est qu’il est bien souvent nécessaire de redémarrer le serveur ou, à défaut, redémarrer l’application. (Cette opération ne dure généralement que quelques secondes voir minutes dans le pire des cas)
Qui dit application web, dit serveur et hébergement. Même si le coût de l’hébergement diminue de plus en plus avec les offres d’IaaS qui se multiplient, c’est un critère à prendre en compte lors du choix de la technologie.
JEE nécessite un serveur d’application ou a minima un conteneur de servlet de type Tomcat pour déployer son application. L’utilisation de ce type de serveur exclut immédiatement les offres de type hébergement web, qui offrent simplement un répertoire et un serveur Apache pour publier son site web. Quoiqu’il en soit, ceci n’est pas un frein car dans le monde professionnel toutes les applications sont hébergées sur des serveurs dédiés.
A contrario, PHP peut être déployé sur un serveur de type web ce qui étend l’offre d’hébergement possible et peut réduire fortement le coût dans le cas d’un petit site web.
Les deux technologies peuvent être hébergées sur n’importe quel OS (Linux, Windows, AIX, …) car elles ne présentent aucune adhérence au système d’exploitation.
En terme de ressources machines, sur un site internet peu complexe, PHP aura tendance à être moins lourd et à consommer moins de ressources que JEEJava Entreprise Edition. Attention, la tendance s’inverse très rapidement lorsque nous sommes confrontés à une application plus complexe qui nécessite de nombreux traitements métier. Si l’on prend par exemple les applications PHP d’OS commerce de type Magento, elles nécessitent énormément de ressources pour fonctionner, multipliant les niveaux de caches et optimisation de filesystem pour tendre vers des performances « acceptables ».
Le problème majeur des frameworks est souvent l’adhérence que cela crée avec la bonne volonté de l’éditeur du framework. En effet, lors des montées de version, il n’est pas toujours garanti que le framework soit rétrocompatible et on se retrouve rapidement avec une version obsolète. Dans le monde de l’entreprise, les choix technologiques et le développement des applications sont des choix qui durent pendant des années voir des dizaines d’années dans les très grandes entreprises. Il n’est pas possible de suivre « la mode » ou les variations rapides des frameworks juste pour le plaisir. De ce côté là, JEE s’en sort mieux car évolue beaucoup moins vite que la concurrence et s’oblige à être toujours rétrocompatible comme le langage JAVA.
PHP de son côté s’autorise des évolutions plus fréquentes sans être pour autant rétrocompatibles. Chaque montée de version implique de nombreux changements au niveau du code source. Le fait que PHP ne soit pas un langage pré-compilé implique une recherche et une modification fastidieuse du code source à chaque montée de version induisant un projet coûteux.
Il est aussi important de noter que le langage JAVA est utilisé pour tout l’univers mobile ANDROID, ce qui est un sacré argument lors que l’on sait qu’AndroidAndroid est un système d'exploitation mobile basé sur Linux. représente 80% des parts de marché. Ainsi, la formation et l’utilisation du code peut se faire qu’une seule fois, ce qui est un sacré gain de temps, là où PHP se cantonne à l’univers du WEB serveur.
Historiquement, les performances de JAVA ne sont pas extrêmement bonnes. JAVA étant par définition un langage pré-compilé et interprété au sein d’un JVM, il est difficile d’obtenir des performances aussi bonnes qu’un langage tel que le C ou le C++. Néanmoins, de version en version et encore plus depuis la version 8, les besoins de JVM ont été largement revu à la baisse. Les besoins des serveurs d’applications, tel que JBoss par exemple ont aussi largement fondues, ce qui permet presque d’avoir le même niveau de consommation ressource. Qui plus est, les problèmes récurrents de JAVA concernant sa forte consommation mémoire ainsi que les fuites incessantes ont été en grande partie réglée, ce qui fait qu’à présent, avec un serveur d’application moderne et une application correctement développée, il est très difficile de perdre de la mémoire.
De son côté, PHP a suivi l’évolution inverse, partant d’un langage très simple et très performant, pour devenir un langage plus complet et plus « professionnel ». De plus, l’utilisation de frameworks pour standardiser les développements ont considérablement augmenter les besoins de ressources. Il n’est par exemple par rare de devoir allouer 8Go de Ram pour des applications OS commerce dès que le catalogue de produits ou que le nombre d’utilisateurs augmente. Si vous avez néanmoins la chance d’avoir un bon expert des performances, il est plus difficile pour lui d’améliorer significativement les performances pour l’intégralité de l’application car les facteurs d’optimisation sont moins clairs à définir.
Afin de clusteriser une application PHP, il suffit la plupart du temps de multiplier le nombre de serveurs et de partager le filesystem au niveau des sessions, ce qui peut se faire rapidement. Ceci est un grand plus, par contre vous laissez donc la base de données gérer les transactions. Il est aussi plus difficile de réaliser un cache distribué car la notion de cluster n’existe « pas vraiment ». La clusterisation est donc facilitée mais, il n’est par exemple pas possible de réaliser simplement des singletons.
De son côté JAVA JEE, apporte nativement, avec la notion de serveurs, la possibilité de réaliser des clusters rapidement et sans développement, juste avec du paramétrage. Revers de la médaille, la configuration des clusters peut s’avérer assez complexe et peut dégrader les performances si celle-ci est mal appréhendée.
La sécurité des données devient un enjeu de plus en plus crucial pour les entreprises. Le vol de données ainsi que les problèmes d’anonymat sont des enjeux majeurs pour les entreprises actuelles.
Même si on ne peut parler de failles de sécurité dans les langages, les utilisateurs de PHP savent bien qu’il est plus difficile de se prémunir des attaques car le langage ne force pas à se sécuriser.
De son côté JEE, valide à chaque étape les données (en particulier avec JSF) de telle sorte qu’il est presque impossible de faire des attaques de types SQLLangage permettant de communiquer avec une base de données. injection par exemple. La relative lourdeur de JEE apporte un gain en sécurité très important, le contrôle et la validation des données n’étant plus laissé à la simple discrétion du développeur mais est directement inclue au cœur du langage. Cet atout sécurité est indéniablement un plus pour le monde JEE.
Pour l’intégration et l’apprentissage des développeurs, le PHP s’avère être extrêmement rapide. En effet, il suffit la plupart du temps de faire un F5 pour voir ses modifications dans son navigateur. De plus une grande partie du code PHP est souvent utilisée de manière procédurale, ce qui simplifie considérable la compréhension par les développeurs.
De son côté, JAVA s’avère être plus complexe de prise en main. L’utilisation du framework JEE ou Spring requiert un bon niveau d’abstraction et il n’est pas rare de voir les développeurs bloquer de longues heures devant des stacktraces d’erreur incompréhensible. Néanmoins, l’obligation de compiler son code force les développeurs à déclarer correctement leurs variables et permet d’appréhender vite des sources d’erreurs typiques. Il est vrai qu’un certain nombre de « module » de JEE (ou SPRING) apportent un vrai niveau de difficulté, par exemple JPA Hibernate, comme vu dans un précédent article crée souvent plus de problème qu’il n’en résout. Les premières applications WEB développées en JAVA ont connu un grand nombre d’échec saisissant en entreprise car la technologie était mal appréhendée par les développeurs et mal adaptée au monde du WEB. Depuis les dernières versions, plus orientées vers le WEB JEE corrige ses défauts de jeunesse et propose finalement un framework plus simple et plus léger que par le passé.
De son côté, PHP est né dans l’univers du WEB et spécialement construit autour de la problématique de la création de page web dynamique. Sa facilité d’utilisation et d’appréhension par les développeurs en ont vite fait un langage de référence dans le monde du WEB. Très rapidement, de nombreux sites web ont été créés avec PHP. Plus que des sites WEB, PHP a rapidement évolué pour être capable de gérer des sites plus complexes. Par exemple des solutions telles que WordPress, MediaWiki, Drupal… ont vu le jour et sont devenues des références dans leurs secteurs, là ou JAVA JEE n’apportait pas la souplesse pour réaliser de telle application et surtout aussi rapidement.
En conclusion, il n’est pas évident de trancher entre ces deux technologies qui sont toutes les deux de bonnes technologies. Néanmoins, il se dégage de l’analyse que plus le projet est conséquent (en complexité et en nombre de développeurs) plus il devient intéressant de s’orienter vers JAVA. A contrario, pour un site plus petit (et une plus petite équipe), il est plus facile de rester sur PHP.
Mais qu’en est-il de Java face à C# ou encore JS ?
Hébergement, monitoring, prix... Posez-vous les bonnes questions pour choisir l'infrastructure de votre application web.
Découvrez la planche #60 !
Tuto - Try-with-resources et java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection