Pourquoi Facebook a-t-il utilisé C ++ à côté de PHP? [fermé]

15

Quelle est la principale raison pour laquelle Facebook a dû utiliser C ++ à côté de PHP? Je me demande si je crée un site Web avec beaucoup de visiteurs, aurais-je besoin d'utiliser C ++ également?

Goma
la source
Peut-être pour les processus back-end mais vous seriez fou de faire du développement web régulier avec.
ChaosPandion
1
La question programmers.stackexchange.com/questions/53624/… aborde également ce problème. Vous voudrez peut-être y jeter un œil.
Vitor Py
4
Pourquoi Google écrit-il ses serveurs en C ++?
Job
1
@Job et Java et Python.
plié à droite
5
@WTP, à ma connaissance, Python est utilisé pour prototyper de nouvelles fonctionnalités et les tester. Une fois que la charge utilisateur devient élevée et que les choses doivent fonctionner aussi vite que possible, le code Python est remplacé par du code C ++. Je suis à peu près sûr qu'une différence de vitesse aussi faible que 1,2 est un gros problème pour les serveurs qui font face à des centaines de millions d'utilisateurs.
Job

Réponses:

20

Voici pourquoi: HipHop pour PHP: Bougez vite :

L'une des valeurs clés de Facebook est d'agir rapidement. Au cours des six dernières années, nous avons pu accomplir beaucoup grâce au rythme de développement rapide que PHP offre. En tant que langage de programmation, PHP est simple. Simple à apprendre, simple à écrire, simple à lire et simple à déboguer. Nous pouvons faire monter en puissance de nouveaux ingénieurs sur Facebook beaucoup plus rapidement avec PHP qu'avec d'autres langages, ce qui nous permet d'innover plus rapidement.

Aujourd'hui, je suis ravi de partager le projet avec une petite équipe de gens incroyables et je travaille depuis deux ans; HipHop pour PHP. Avec HipHop, nous avons réduit l'utilisation du processeur sur nos serveurs Web en moyenne d'environ cinquante pour cent, selon la page. Moins de CPU signifie moins de serveurs, ce qui signifie moins de surcharge. Ce projet a eu un impact énorme sur Facebook. Nous pensons que le Web dans son ensemble peut bénéficier de HipHop, nous le publions donc ce soir en open source dans l'espoir qu'il apporte une nouvelle orientation vers la mise à l'échelle de grands sites Web complexes avec PHP. Bien que HipHop nous ait montré des résultats incroyables, il n'est certainement pas complet et vous devriez être à l'aise avec le logiciel bêta avant de l'essayer.

HipHop pour PHP n'est pas techniquement un compilateur lui-même. Il s'agit plutôt d'un transformateur de code source. HipHop transforme par programmation votre code source PHP en C ++ hautement optimisé, puis utilise g ++ pour le compiler. HipHop exécute le code source d'une manière sémantiquement équivalente et sacrifie certaines fonctionnalités rarement utilisées - telles que eval () - en échange de meilleures performances. HipHop comprend un transformateur de code, une réimplémentation du système d'exécution de PHP et une réécriture de nombreuses extensions PHP courantes pour tirer parti de ces optimisations de performances.

Faire évoluer PHP en tant que langage de script

Les racines de PHP sont celles d'un langage de script, comme Perl, Python et Ruby, qui ont tous des avantages majeurs en termes de productivité du programmeur et la capacité d'itérer rapidement sur les produits. Ceci est comparé aux langages compilés plus traditionnels comme C ++ et aux langages interprétés comme Java. D'un autre côté, les langages de script sont généralement connus pour être moins efficaces en ce qui concerne l'utilisation du processeur et de la mémoire. Pour cette raison, il a été difficile de faire évoluer Facebook à plus de 400 milliards de pages vues PHP chaque mois.

Une façon courante de remédier à ces inefficacités consiste à réécrire les parties les plus complexes de votre application PHP directement en C ++ en tant qu'extensions PHP. Cela transforme largement PHP en un langage de collage entre votre HTML frontal et la logique d'application en C ++. D'un point de vue technique, cela fonctionne bien, mais réduit considérablement le nombre d'ingénieurs capables de travailler sur l'ensemble de votre application. Apprendre le C ++ n'est que la première étape pour écrire des extensions PHP, la seconde est de comprendre les API Zend. Étant donné que notre équipe d'ingénieurs est relativement petite - il y a plus d'un million d'utilisateurs pour chaque ingénieur - nous ne pouvons pas nous permettre de rendre des parties de notre base de code moins accessibles que d'autres.

La mise à l'échelle de Facebook est particulièrement difficile car presque chaque page vue est un utilisateur connecté avec une expérience personnalisée. Lorsque vous consultez votre page d'accueil, nous devons rechercher tous vos amis, interroger leurs mises à jour les plus pertinentes (à partir d'un service personnalisé que nous avons créé appelé Multifeed), filtrer les résultats en fonction de vos paramètres de confidentialité, puis remplir les histoires avec des commentaires , photos, likes et toutes les données riches que les gens aiment sur Facebook. Tout cela en moins d'une seconde. HipHop nous permet d'écrire la logique qui fait l'assemblage final de la page en PHP et de l'itérer rapidement tout en s'appuyant sur des services back-end personnalisés en C ++, Erlang, Java ou Python pour desservir le fil d'actualités, la recherche, le chat et d'autres parties principales du site.

Depuis 2007, nous avons réfléchi à différentes manières de résoudre ces problèmes et avons même essayé d'en mettre en œuvre quelques-unes. La suggestion courante est de simplement réécrire Facebook dans une autre langue, mais compte tenu de la complexité et de la vitesse de développement du site, cela prendrait du temps. Nous avons réécrit certains aspects du moteur Zend - les composants internes de PHP - et avons contribué ces correctifs dans le projet PHP, mais nous n'avons finalement pas vu le type d'augmentation des performances qui est nécessaire. Les avantages de HipHop sont presque transparents à notre vitesse de développement.

Hacking Up HipHop

Une nuit à un Hackathon il y a quelques années (voir Prime Time Hack), j'ai commencé mon premier morceau de code transformant PHP en C ++. Les langages sont assez similaires syntaxiquement et C ++ surpasse considérablement PHP en ce qui concerne à la fois l'utilisation du CPU et de la mémoire. Même PHP lui-même est écrit en C. Nous savions qu'il était impossible de réécrire avec succès une base de code entière de cette taille à la main, mais nous nous demandions ce qui se passerait si nous construisions un système pour le faire par programme.

Trouver de nouvelles façons d'améliorer les performances PHP n'est pas un nouveau concept. Au moment de l'exécution, le moteur Zend transforme votre source PHP en opcodes qui sont ensuite exécutés via la machine virtuelle Zend. Les projets open source tels que APC et eAccelerator mettent en cache cette sortie et sont utilisés par la majorité des sites Web propulsés par PHP. Il y a aussi Zend Server, un produit commercial qui accélère PHP via l'optimisation et la mise en cache d'opcode. Au lieu de cela, nous pensions à transformer directement la source PHP en C ++ qui peut ensuite être transformé en code machine natif. Même la compilation de PHP n'est pas une idée nouvelle, les projets open source comme Roadsend et phc compilent PHP en C, Quercus compile PHP en Java et Phalanger compile PHP en .Net.

Inutile de dire que cela a pris plus de temps que ce seul Hackathon. Huit mois plus tard, j'avais suffisamment de code pour démontrer qu'il était en effet possible de fonctionner plus rapidement avec du code compilé. Nous avons rapidement ajouté Iain Proctor et Minghui Yang à l'équipe pour accélérer le rythme du projet. Nous avons passé les dix mois suivants à terminer le codage et les six mois suivants à tester sur les serveurs de production. Nous sommes fiers de dire qu'à ce stade, nous desservons plus de 90% de notre trafic Web à l'aide de HipHop, tous six mois seulement après le déploiement.

Comment fonctionne HipHop

Le principal défi du projet était de combler le fossé entre PHP et C ++. PHP est un langage de script avec une frappe dynamique et faible. C ++ est un langage compilé avec typage statique. Alors que PHP vous permet d'écrire des fonctionnalités dynamiques magiques, la plupart de PHP est relativement simple. Il est plus probable que vous voyiez if (...) {...} else {..}que ce que vous voyez function foo($x) { include $x; }. C'est là que nous gagnons en performances. Dans la mesure du possible, notre code généré utilise une liaison statique pour les fonctions et les variables. Nous utilisons également l'inférence de type pour choisir le type le plus spécifique possible pour nos variables et ainsi économiser de la mémoire.

Le processus de transformation comprend trois étapes principales:

  1. Analyse statique où nous collectons des informations sur qui déclare quoi et les dépendances,
  2. Inférence de type où nous choisissons le type le plus spécifique entre les scalaires C ++, String, Array, classes, Object et Variant, et
  3. Génération de code qui pour la plupart est une correspondance directe des instructions et expressions PHP avec les instructions et expressions C ++.

Nous avons également développé HPHPi, qui est un interpréteur expérimental conçu pour le développement. Lorsque vous utilisez HPHPi, vous n'avez pas besoin de compiler votre code source PHP avant de l'exécuter. Cela nous a aidés à détecter des bogues dans HipHop lui-même et offre aux ingénieurs un moyen d'utiliser HipHop sans changer la façon dont ils écrivent PHP.

Globalement, HipHop nous permet de conserver les meilleurs aspects de PHP tout en profitant des avantages de performance de C ++. Au total, nous avons écrit plus de 300 000 lignes de code et plus de 5 000 tests unitaires.

Trinidad
la source
4
Telle est la réponse, un peu de couleur aurait été bien, mais au fond, c'est une question de performance. Ils souhaitent que leur application évolue mieux, mais ils disposent également de personnes plus compétentes en PHP et pensent que PHP les rend plus productifs. Ainsi, la solution permet la simplicité de PHP avec les performances de C. Leur base de code est trop grande pour le traduire manuellement de toute façon.
Cervo
13

Réponse courte - non, vous n'avez pas besoin de C ++.

Je pense que vous faites référence à HipHop . Si vous lisez les améliorations qu'il apporte, c'est environ 50%. C'est très important si vous êtes Facebook qui a des milliers de serveurs frontaux. La réduction de la charge sur eux signifie des millions d'économies sur les coûts du centre de données. Dans le cas d'une entreprise disposant de 10 à 100 serveurs frontaux, le coût de développement dépasserait largement les économies possibles. Quoi qu'il en soit, le traitement le plus lourd est effectué dans le back-end, qui est généralement une solution RDBMS ou NoSQL, développée en tant que code C / C ++ hautement optimisé.

Bien sûr, le aurait pu réaliser des économies beaucoup plus élevées simplement en vidant complètement PHP. Mais ce n'est pas quelque chose que vous pouvez faire avec une énorme base de code, comme dans le cas de Facebook.

Maintenant, pour l'autre partie de la question: si vous voulez vraiment savoir comment gérer des charges énormes, lisez le blog High Scalability , en particulier la partie Real Life Architectures.

C'est possible avec PHP, mais ce ne serait certainement pas mon choix. Si vous voulez un langage dynamique, Python, Ruby ou peut-être Lua serait un bien meilleur choix.

vartec
la source
2
+1, mais l'évolutivité n'a pratiquement rien à voir avec la langue utilisée. L'architecture de la base de données a une portée beaucoup plus importante.
dan_waterworth
1
@Dan: c'est pourquoi je dis - c'est possible avec PHP.
vartec
2
Selon l'article de blog cité @Trinidad cité, 50% est l' amélioration moyenne , pas le maximum.
Jerry Coffin
2
@Jerry: c'est vrai, mais c'est encore très, très loin de la différence de performance réelle entre C ++ et PHP.
vartec
6

Ce qui est bien avec l'approche de FB, c'est qu'ils n'ont pas eu à décider tout de suite. Tu devrais faire pareil. Choisissez le langage qui vous rend le plus productif, mais assurez-vous qu'il s'interface facilement avec C / C ++.

Une fois que vous avez des millions d'utilisateurs et devez réduire les millisecondes des temps de réponse, vous pouvez optimiser les chemins critiques à l'aide de C / C ++.

Scant Roger
la source
0

L'élément C ++ utilisé par Facebook est le HHVM.

C'est la machine virtuelle HIPHOP. Bien qu'écrit en C ++, il s'agit essentiellement d'un "meilleur interprète PHP".

Le code php est compilé en code octet qui est ensuite interprété par le HHVM au moment de l'exécution et est soumis à des optimisations "Just In Time" lors de son exécution.

Les développeurs de face book écrivent toujours principalement en PHP, et ce que vous voyez sur votre navigateur est presque certainement sorti par un programme PHP - tout en étant compilé et interprété par le runtime HHVM.

Le HHVM proprement dit est open source gratuitement. Donc, si vous avez besoin de servir un million de photos de chaton mignon par heure, vous pouvez télécharger le HHVM et accélérer votre serveur avec un minimum de changements dans votre PHP.

James Anderson
la source