Séjour linguistique
11 avril 2009 - 19 commentaires
Hellotipi fonctionne actuellement avec un framework maison, inspiré de ce qui se fait dans pas mal de projets: MVC, Couche d’abstraction (partielle) pour accéder à MySQL, dico Gettext, Scriptaculous pour le js etc…
Ce n’est pas parfait mais pour un projet dont les bases ont été conçues il y a 3 ans je dois avouer que c’est assez propre.
Je développe en PHP depuis 8 ans maintenant (j’ai débuté en PHP 3), mais j’aime bien garder un œil sur ce qui se fait dans les autres projets web.
Lorsque j’ai imaginé Hellotipi je m’étais posé la question d’utiliser Ruby On Rails.
Mais la jeunesse du framework et ma non connaissance du langage Ruby m’avait poussé à choisir PHP.
De même, les framework PHP de l’époque étaient émergeant, ce qui m’avait décidé à créer ma propre architecture.
Dans les prochains mois je me lancerai probablement dans un grand ménage de l’architecture d’Hellotipi de manière à accompagner au mieux deux objectifs: montée en charge et internationalisation.
Je me pose la question de passer à Ruby on Rails ou à un framewok PHP (Zend, Symfony ou Cake) ou garder mon framework maison.
Concernant l’internationalisation je pense que les différences ne sont pas énormes, par contre pour la capacité à monter en charge je suis preneur en avis.
Je profite de ce billet pour remercier Nicolas et Raphaël pour leurs conseils (tout les 2 fans de Ruby on Rails
)

Comments closed
Discussion:
Hein? Quoi? Pardon?
Personnellement après avoir regardé les framework que tu cites voilà mon humble avis.
Symfony: usine a gaz
Cake php: autant prendre RoR
RoR: sympa, il faut juste le temps de ce mettre dedans
Zend: Bien complet, assez sympa. Peut être un poil trop complexe pour des choses qui pourrait être très simple à réalisées.
Cependant j’ai découvert CodeIgniter et la, je ne peux plus m’en séparer. Déjà parcequ’il est simple mais puissant. Ca doc est extrêmement bien faite, il existes déjà pas mal de librairies et modules créés par la communauté (par exemple pour de l’ORM). Enfin dernier point qui peut t’intéresser, d’après les tests que j’ai pus lire (à prendre avec des pincettes cependant) il est le plus rapide comparé à ceux cités plus haut.
Voilà voilà
Excellente question.
pour ma part, j’utilise Zend pour la prochaine version de Wanarun et j’avoue que je suis globalement assez content !
Mais je ne suis pas un grand fan de MVC… donc je préfère faire sans…
Cela dépends de tes besoins mais surtout de ton architecture actuelle. Tu comptes recoder de zéro ?
Si tu veux une intégration en douceur, je te conseille Symfony ou Zend qui proposent un couplage très faible. Tu pourras intégrer petit à petit le nouveau framework dans le tien en t’en servant comme librairies avant de faire le grand saut…
J’ai une préférence pour symfony (francais, normal :p). Sinon, du coté de python (jettes y un oreil aussi, il n’y a pas que ruby comme alternatives), il y a django (sur lequel symfony s’est largement inspiré d’ailleurs…). Le passage de PHP à python m’a pris 5 jours ! Et niveau performances ca n’a rien a voir ! Aussi l’ORM de django laisse à la rue les équivalents PHP (Propel / Doctrine…)
Pour ma part cakePHP ne m’a jamais emballé : Ils veulent garder à tout pris la compatibilité PHP4 (ce qui n’en fait pas un framework exploitant pleinement l’Orienté Objet de PHP) et son couplage fort… Il y a CodeIgniter du même genre en plus light…
Ce qui est géniale c’est quand d’avoir autant de choix et des technos de plus en plus matures. Le tout open source que demander de mieux
Pour ma part je viens de me mettre à Zend et j’en suis très content.
Concernant l’internationalisation, c’est un problème « commun », la structure à adopter ne variera pas en fonction du langage utilisé. J’ai pour ma part décidé de m’appuyer sur la puissance du modèle MVC : le code reste le même, juste le format de sortie est différent, selon la langue de l’utilisateur.
C’est une solution très simple à mettre en place, très rapide aussi, mais qui a aussi des inconvénients ; en cas de modification dans ce format de sortie (au niveau des balises HTML, par exemple), il est nécessaire de répéter la modification à plusieurs endroits.
Une autre solution : Utiliser un jeu de constantes, définies selon la langage. C’est peut être moins naturel au niveau du code HTML de sortie, c’est aussi moins souple, mais la moindre modification agit partout.
Concernant l’optimisation, question qui me semble bien plus intéressante, il y a de nombreux paramètres à prendre en compte. J’ai du mal à me rendre compte des processus et scripts qui tournent en arrière-plan (lancés par cron, par exemple), sur Hellotipi. Sont-ils nombreux ? Sont-ils complexes ? Si oui, n’auraient-ils pas intérêt à être codé dans un vrai langage de programmation (C/C++ par exemple), pour gagner en performance ? C’est le choix que j’ai fait pour le coeur de Blogonet (Bot et moteur de recherche), les perfs sont tout simplement époustouflantes.
Concernant le choix PHP / Ruby on Rails, au niveau de l’interaction utilisateur, pour un projet de cette envergure, je n’aurais pas pris de risque, et gardé ce que je maîtrise. Tu gagneras peut-être un peu en perf (et encore, j’en suis pas sûr, je laisse les pros de Ruby on Rails statuer à ce niveau), mais perdras sûrement beaucoup en temps de développement. A ce stade là, en fonction du temps perdu, n’est-il pas plus intéressant de payer une machine supplémentaire ?
D’autres part, tu les utilises peut-être déjà, mais il existe de très bon outils d’op-code cache en PHP. Ca permet de garder une version « compilée » des scripts en mémoire, pour éviter de refaire l’opération à chaque appel. C’est radical, l’amélioration est visible à l’oeil nu.
Enfin, le choix entre PHP et Ruby on Rails est-il réellement celui qui te permettra de gagner un maximum en performance, et de tenir un maximum la charge ? C’est connu, le premier à poser problème lors d’une monté en charge est souvent le SGBD. Ne serait-il pas intéressant de regarder à ce niveau là aussi ?
Julien.
Julien> J’avais testé CodeIgniter qui en effet était séduisant car très léger.
Manu> Zend me séduit pas mal, surtout pour une boite (à terme) internationale.
Brindavoine> merci pour ton tweet, à la suite duquel je suis aller jeter un oeil à Python/Django: ça m’a l’air bien sympa en effet.
eMeRiKa> c’est vrai qu’avoir un tel choix c’est agréable
Jukien> concernant le passer à un autre langage que PHP c’est aussi ce que je me dis.
Surtout qu’en général les problèmes de charge sur des projets comme Hellotipi viennent plus du coté de la base de données que du langage de programmation.
Pour aider à la reflexion:
Actuellement je suis sur un seul dédié (costaud) et j’ai une bonne marge de sécurité.
Je voudrais passer à un découpage Load balancé: x machines Apache + x machines MySQL + x machines memcached
Surement via Amazon EC2 + Rightscale ou Scalr
Fidèle lecteur de ce blog, je sors de l’ombre et publie ici mon premier commentaire.
En effet je suis en pleine réflexion sur le sujet. J’ai un projet de site web et je me pose la question de la techno à utiliser. Je précise que je connais (un peu PHP) mais que je suis surtout un spécialiste du monde Java et du framework Struts notamment.
Quel est l’intérêt de développer en Php quand on maitrise à fond les technos Java ? Côté perf, il me semble qu’il n’y a pas photo : Java l’emporte haut la main. Le seul intérêt que je vois à Php est qu’il est disponible sur de nombreuses solutions d’hébergement pas chère prêtes à l’emploi et que l’on peut faire des petits scripts tout simples très facilement. Mais pour un vrai site web ? Ne vaut-il pas mieux installer un bon serveur Tomcat et tout faire en Java ? Je me pose aussi la question de la capacité des machines (CPU et mémoire) nécessaires pour faire tourner un serveur Tomcat et un serveur Php.
Qu’en pensez-vous ?
CodeIgniter rules !
@talonescu : La principale différence entre PHP et Java, en dehors des performances, est clairement le temps de développement. Comme tu le dis, PHP est un langage tellement simple (et trop permissif, d’ailleurs) qu’il est accessible pour n’importe quel débutant ; il permet notamment d’insérer une ligne de PHP seulement, dans un tas de fichiers statiques HTML.
Ce n’est pas le cas de Java : il demande plus de rigueur, et plus de connaissance (l’orienté objet est, en lui même, un concept à comprendre pour un débutant). Pour un petit site, sa mise en place demande plus de temps, plus d’effort. Sans compte le nombre réduit d’hébergement low-cost proposant Java dans leurs offres mutualisées.
En revanche, pour un projet de plus grande envergure, c’est une alternative très intéressante, de plus en plus utilisée par les entreprises. De mon coté, je reconnais ne pas être assez familier avec Java pour oser l’utiliser dans un gros projet. J’ai déjà touché, je comprends les concepts, mais je suis beaucoup plus à l’aise avec le C++. Ainsi, j’utilise PHP lorsque les performances n’entrent pas réellement en jeu ; 100 lignes PHP se traduisent par plus de 500 lignes en C++.
Finalement, tout dépend ce que tu souhaites en faire. Un gros projet, dynamique, sur serveur dédié, oui : si tu maîtrises suffisamment Java, n’hésite pas. Mais pour un petit site, quasi-statique, tu perds clairement ton temps.
[ Excusez mon commentaire précédent : je ne me suis pas relu, et ça se voit. Je vous fais confiance pour corriger les fautes, et rajouter les mots qu'il manque
]
(ah la vache : the sujet de barbus !!!) sort discrètement en admirant
J’hésite moi même régulièrement entre poursuivre mes développements avec mon « metaframework » maison ( http://webappkit.net ) et passer à python/Django. Je fais moi aussi du PHP depuis la version 3 et perdre l’aisance que je peux y avoir m’a toujours freiné jusqu’ici, même si python me fait de l’oeil depuis des années.
Pour l’instant je suis sur une solution intermédiaire, à savoir implémenter en PHP certains des composants de Django (le moteur de templates est fait, je vais prochainement m’attaquer à forms), qui est très bien pensé.
Pour ce qui est des performances, python a une très bonne réputation. Sinon, je pense qu’en PHP le plus performant est de se passer de framework en se reposant par exemple sur la réécriture d’url d’apache.
Un peu de lecture intéressante: http://www.angryobjects.com/2009/03/30/writing-robust-php-backends-with-zend-framework/
Je n’ai pas eu l’occasion de tout tester mais j’ai choisi Symfony et j’avoue que son point faible est aussi sont point fort.
En gros c’est un framework ou tout est bien cadré. Du coup c’est assez difficile de sortir des rails et on doit suivre la logique de développement du framework, mais c’est aussi ce qui assure un code relativement propre et bien construit.
Je n’ai pas encore eu l’occasion de tester une grosse montée en charge mais à ceux qui disent que Symfony ne tient pas la charge, il faut rappeler que Yahoo Answers et Dailymotion tournent dessus
J’ai fait pas mal de développement web (php3, jsp, asp,..) et j’aurai tendance à penser que les problèmes de scalabilité ne sont pas vraiment liés au framework utilisé, mais plus à la capacité de la base de données à scaler tant en terme de read que de write.
Ayant jeté un oeil il y a qqs temps à php, il me semble que Zend et Symfony proposent à peu près la même chose, MVC + précompilation du code (avec APC pour Symfony). C’est le modèle que l’on retrouve avec la plupart des frameworks JAVA depuis 5 ans.
La nouvelle mouture de frameworks apparus récemment (RoR, Django, Seam,…) permettent à mon avis d’améliorer la productivité, pas nécessairement la scalabilité. Je pense que le choix d’un framework se base avant tout sur ses connaissances, et éventuellement sur l’idée d’aller plus vite qu’avec l’existant.
Les nouveaux frameworks proposent des outils de scaffolding (échafaudage) qui permettent de générer rapidement des pages à la CRUD.
J’ai jeté un oeil à RoR il y a 2 ans, et je dois dire que je n’ai pas accroché à l’époque (gout personnel certainement).
Aujourd’hui je me forme à Django, qui me semble plus cohérent (gout personnel toujours), mais qui me permet aussi de profiter de Python, qui est un langage à tout faire qui dispose aujourd’hui d’énormément d’API et du soutien de Google. C’est le choix que je ferai dans le cadre d’un nouveau développement, pas nécessairement dans le cas d’une refonte.
En termes de scalabilité, je pense que le travail se situe plus au niveau de la base de données. Aujourd’hui, les gros sites se basent essentiellement sur MySQL et sur le sharding des données sur plusieurs serveurs. Pour plus d’infos sur les différentes techniques de sharding, je te conseille la lecture du chapitre 9 de l’excellent High performance MySQL : http://oreilly.com/catalog/9780596101718/
(il faut prendre la seconde édition qui couvre MySQL 5.1, qui dispose du partitionnement des données)
Ce bouquin parle aussi de Sphinx, qui est un moteur de recherche distribué très puissant et utilisé sur des sites comme Craigslist et Dailymotion (www.sphinxsearch.com).
Sinon concernant l’écriture des données, la technique conseillée pour les sites à forte charge est l’asynchrone, on se base sur des fichiers de log qui sont traités de manière asynchrone, et on maintient l’état de l’application en Javascript.
Tu pourras trouver tout un tas d’infos très intéressantes sur le sujet sur le site : http://highscalability.com
J’y ai trouvé un article qui détaille l’architecture de netlog (gros réseau social européen) : http://www.jurriaanpersyn.com/archives/2009/02/12/database-sharding-at-netlog-with-mysql-and-php/
Il faut aussi penser à l’utilisation des caches style memcached, mais n’ayant pas encore testé la bête, je ne vais pas m’étendre.
Sinon, pour finir, je pense qu’une des solution pour atteindre la scalabilité est l’utilisation d’une architecture REST, qui permet la réutilisation de l’artillerie déjà développée pour la scalabilité du web (reverse proxy, caches http & co) et la mise à disposition automatique d’API (tout comme RoR et Django il me semble).
Je ne sais pas si tu as des problématiques de mise à jour du graphe, mais chez LinkedIn, ça avait l’air de poser problème, et ils ont développé un truc maison pour ça : http://hurvitz.org/blog/2008/06/linkedin-architecture
J’espère que mon commentaire pourra t’aura été utile.
Bon courage et @+
Pour ma part, j’utilise Symfony
depuis un an et c’est un vrai bonheur de travailler sur un système fortement cadré. C’est un peu complexe à prendre en main et assez déroutant quant à la profusion de fichier yml et php, mais une fois cette étape de découverte passée, ce framework révèle sa puissance et sa souplesse. Le code reste propre, bien structuré, facile à maintenir et évolutif.
Concernant l’internationalisation, elle est très puissante et gère (quasi) automatiquement les traductions stockés en base pour les éléments dynamiques et dans des fichiers xml pour les traductions statiques.
Peu être une ombre au tableau tout de même, sur certains points il peut être un peu trop passif. Certaines erreurs ne sont pas attrapées ce qui oblige parfois à mettre les mains dans le cambouis.
Tu peux jeter un œil sur le dernier tutoriel en date sur Symfony 1.2 => Jobeet. On y retrouve une grande partie du fonctionnement et des différents points forts de ce framework.
Skwi, Miguel, Benjamin> merci beaucoup pour les feedback, je ferais un billet une fois mon choix établi.
Personnellement, je te conseillerai le framework Zend. Bon comme toute chose, il faut le prendre en main mais ça va assez vite, il possède une documentation complète, une communauté active et pas mal de source sur le net.
Je l’utilise depuis pas mal de temps maintenant et je dois dire que j’en suis très content