web-dev-qa-db-fra.com

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

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?

15
Goma

Voici pourquoi: HipHop pour PHP: Move Fast :

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

Aujourd'hui, je suis ravi de partager le projet avec une petite équipe de personnes extraordinaires 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, donc nous le publions 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 un réécriture de nombreuses extensions PHP PHP communes pour profiter de ces optimisations de performances.

Mise à l'échelle PHP comme 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++ sous la forme PHP Extensions. Cela transforme largement PHP dans 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. L'apprentissage du C++ n'est que la première étape pour écrire PHP Extensions, 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 certaines 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 de la page finale 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 servir le fil d'actualités, la recherche, le chat et d'autres parties essentielles 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 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 transparent à 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 drastiquement 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 en main, mais se demandait ce qui se passerait si nous construisions un système pour le faire par programme.

Trouver de nouvelles façons d'améliorer PHP performance 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 le Zend Virtual Machine. Des 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 existe également Zend Server, un produit commercial qui fait PHP plus rapide via l'optimisation des opcodes et la mise en cache. Au lieu de cela, nous pensions à transformer PHP directement en C++ qui peut ensuite être transformé en code machine natif. Même en compilant PHP n'est pas une nouvelle idée, les projets open source comme Roadsend et phc compile PHP vers C, Quercus compile PHP vers 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 a été de combler l'écart entre PHP et C++. PHP est un langage de script avec un typage 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 PHP est relativement simple. Il est plus probable que vous voyiez if (...) {...} else {..} que de voir 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 économisez donc 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é à détecter les 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.

20
Trinidad

Réponse courte - non, vous n'avez pas besoin 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 de coûts de 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 PHP complètement. 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 une 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.

13
vartec

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++.

6
Scant Roger

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 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 généré par un programme PHP - tout en étant compilé et interprété par le runtime HHVM .

Le HHVM proprement dit est open source librement disponible. 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 changement minimal de votre PHP.

0
James Anderson