it-swarm-eu.dev

Warum hat Facebook neben PHP C ++ verwendet?

Was ist der Hauptgrund, warum Facebook C++ neben PHP verwenden musste? Ich frage mich, ob ich eine Website mit vielen Besuchern erstellen muss, um auch C++ zu verwenden.

15
Goma

Hier ist der Grund: HipHop für PHP: Move Fast :

Einer der wichtigsten Werte bei Facebook ist, sich schnell zu bewegen. In den letzten sechs Jahren konnten wir dank des schnellen Entwicklungstempos, das PHP bietet) viel erreichen. Als Programmiersprache ist PHP einfach Einfach zu erlernen, einfach zu schreiben, einfach zu lesen und einfach zu debuggen. Mit PHP) können wir neue Ingenieure bei Facebook viel schneller hochfahren als mit anderen Sprachen, was dies ermöglicht uns schneller zu innovieren.

Heute freue ich mich darauf, das Projekt mit einem kleinen Team von erstaunlichen Menschen zu teilen, an denen ich seit zwei Jahren arbeite. HipHop für PHP. Mit HipHop haben wir die CPU-Auslastung unserer Webserver je nach Seite um durchschnittlich etwa fünfzig Prozent reduziert. Weniger CPU bedeutet weniger Server, was weniger Overhead bedeutet. Dieses Projekt hatte enorme Auswirkungen auf Facebook. Wir sind der Meinung, dass das Web insgesamt von HipHop profitieren kann. Deshalb veröffentlichen wir es heute Abend als Open Source in der Hoffnung, dass es einen neuen Fokus auf die Skalierung großer komplexer Websites mit PHP bringt. Obwohl HipHop uns unglaubliche Ergebnisse gezeigt hat, ist es sicherlich nicht vollständig und Sie sollten mit der Beta-Software vertraut sein, bevor Sie sie ausprobieren.

HipHop für PHP ist technisch gesehen kein Compiler selbst. Es ist vielmehr ein Quellcode-Transformator. HipHop wandelt Ihren PHP Quellcode programmgesteuert in hochoptimiertes C++ um und dann) verwendet g ++ zum Kompilieren. HipHop führt den Quellcode semantisch äquivalent aus und opfert einige selten verwendete Funktionen - wie eval () - im Austausch für eine verbesserte Leistung. HipHop enthält einen Codetransformator, eine Neuimplementierung des PHP-Laufzeitsystems und a Umschreiben vieler gängiger PHP -Erweiterungen, um diese Leistungsoptimierungen zu nutzen.

Skalierung PHP als Skriptsprache

Die Wurzeln von PHP liegen in einer Skriptsprache wie Perl, Python und Ruby, die alle große Vorteile in Bezug auf die Produktivität der Programmierer und die Fähigkeit haben, schnell auf Produkten zu iterieren. Dies wird mit traditionelleren kompilierten Sprachen wie C++ und interpretierten Sprachen wie Java verglichen. Andererseits ist bekannt, dass Skriptsprachen im Allgemeinen weniger effizient sind, wenn es um die CPU- und Speichernutzung geht. Aus diesem Grund war es schwierig, Facebook jeden Monat auf über 400 Milliarden PHP-basierte Seitenaufrufe zu skalieren.

Eine übliche Methode, um diese Ineffizienzen zu beheben, besteht darin, die komplexeren Teile Ihrer PHP -Anwendung direkt in C++ als PHP -Erweiterungen) neu zu schreiben. Dies transformiert weitgehend PHP in eine Klebesprache zwischen Ihrem Front-End-HTML und der Anwendungslogik in C++. Aus technischer Sicht funktioniert dies gut, reduziert jedoch die Anzahl der Ingenieure, die an Ihrer gesamten Anwendung arbeiten können, drastisch. Das Erlernen von C++ ist nur möglich Der erste Schritt zum Schreiben von PHP Extensions, der zweite Schritt ist das Verständnis der Zend-APIs. Da unser Engineering-Team relativ klein ist - jeder Ingenieur hat über eine Million Benutzer - können wir uns das nicht leisten Teile unserer Codebasis weniger zugänglich machen als andere.

Das Skalieren von Facebook ist besonders schwierig, da fast jede Seitenansicht ein angemeldeter Benutzer mit einer benutzerdefinierten Erfahrung ist. Wenn Sie Ihre Homepage anzeigen, müssen Sie alle Ihre Freunde nachschlagen, ihre wichtigsten Updates abfragen (von einem von uns erstellten benutzerdefinierten Dienst namens Multifeed), die Ergebnisse basierend auf Ihren Datenschutzeinstellungen filtern und die Storys dann mit Kommentaren ausfüllen , Fotos, Likes und all die umfangreichen Daten, die die Leute an Facebook lieben. All dies in knapp einer Sekunde. Mit HipHop können wir die Logik für die endgültige Seitenassemblierung in PHP] schreiben und schnell iterieren, während wir uns auf benutzerdefinierte Back-End-Dienste in C++, Erlang, Java oder Python, um den Newsfeed, die Suche, den Chat und andere Kernteile der Website zu warten.

Seit 2007 haben wir über verschiedene Möglichkeiten nachgedacht, um diese Probleme zu lösen, und sogar versucht, einige davon zu implementieren. Der übliche Vorschlag ist, Facebook nur in einer anderen Sprache umzuschreiben. Angesichts der Komplexität und Geschwindigkeit der Entwicklung der Website würde dies jedoch einige Zeit in Anspruch nehmen. Wir haben Aspekte der Zend Engine - PHPs Interna - umgeschrieben und diese Patches wieder in das Projekt PHP] eingebracht, aber letztendlich nicht die Art von Leistungssteigerungen gesehen, die erforderlich sind. Die Vorteile von HipHop sind nahezu transparent für unsere Entwicklungsgeschwindigkeit.

HipHop hacken

Eines Nachts bei einem Hackathon vor einigen Jahren (siehe Prime Time Hack) begann ich mit meinem ersten Code, der PHP in C++) transformierte. Die Sprachen sind syntaktisch ziemlich ähnlich und C++ übertrifft === drastisch PHP, wenn es um die CPU- und Speichernutzung geht. Sogar PHP selbst ist in C geschrieben. Wir wussten, dass es unmöglich war, eine gesamte Codebasis dieser Größe erfolgreich umzuschreiben Hand, aber fragte mich, was passieren würde, wenn wir ein System bauen würden, um es programmatisch zu tun.

Suche nach neuen Möglichkeiten zur Verbesserung der Leistung PHP Leistung ist kein neues Konzept. Zur Laufzeit wandelt die Zend Engine Ihre PHP Quelle in Opcodes um, die dann durch die Zend Virtual Machine. Open Source-Projekte wie APC und eAccelerator speichern diese Ausgabe im Cache und werden von den meisten Websites mit PHP) verwendet. Es gibt auch Zend Server, ein kommerzielles Produkt, das PHP schneller durch Opcode-Optimierung und Caching. Stattdessen haben wir darüber nachgedacht, PHP Quelle direkt in C++ umzuwandeln, die dann in nativen Maschinencode umgewandelt werden kann. Sogar Kompilieren PHP ist keine neue Idee, Open Source-Projekte wie Roadsend und phc compile PHP bis C, Quercus kompiliert PHP bis Java und Phalanger) kompiliert PHP to .Net.

Unnötig zu erwähnen, dass es länger gedauert hat als dieser einzelne Hackathon. Acht Monate später hatte ich genug Code, um zu demonstrieren, dass es tatsächlich möglich ist, mit kompiliertem Code schneller zu laufen. Wir haben dem Team schnell Iain Proctor und Minghui Yang hinzugefügt, um das Tempo des Projekts zu beschleunigen. Wir haben die nächsten zehn Monate damit verbracht, die gesamte Codierung abzuschließen und die folgenden sechs Monate auf Produktionsservern zu testen. Wir sind stolz darauf, dass wir derzeit über 90% unseres Webverkehrs mit HipHop bereitstellen, alle nur sechs Monate nach der Bereitstellung.

Wie HipHop funktioniert

Die größte Herausforderung des Projekts bestand darin, die Lücke zwischen PHP und C++. PHP ist eine Skriptsprache mit dynamischer, schwacher Typisierung. C++ ist eine kompilierte Sprache mit statische Eingabe. Während PHP das Schreiben magischer dynamischer Funktionen ermöglicht, sind die meisten PHP relativ einfach. Es ist wahrscheinlicher, dass Sie if (...) {...} else {..} sehen als es zu sehen ist function foo($x) { include $x; }. Hier gewinnen wir an Leistung. Wann immer möglich, verwendet unser generierter Code eine statische Bindung für Funktionen und Variablen. Wir verwenden auch Typinferenz, um den spezifischsten Typ auszuwählen, der für unsere Variablen und möglich ist So sparen Sie Speicher.

Der Transformationsprozess umfasst drei Hauptschritte:

  1. Statische Analyse, bei der wir Informationen darüber sammeln, wer was deklariert und Abhängigkeiten,
  2. Typinferenz, bei der wir den spezifischsten Typ zwischen C++ - Skalaren, String, Array, Klassen, Objekt und Variante und auswählen
  3. Codegenerierung, die größtenteils eine direkte Entsprechung von PHP Anweisungen und Ausdrücken zu C++ - Anweisungen und Ausdrücken ist.

Wir haben auch HPHPi entwickelt, einen experimentellen Interpreter, der für die Entwicklung entwickelt wurde. Wenn Sie HPHPi verwenden, müssen Sie Ihren PHP Quellcode) nicht kompilieren, bevor Sie ihn ausführen. Dies hat uns dabei geholfen, Fehler in HipHop selbst zu erkennen, und bietet Ingenieuren die Möglichkeit, HipHop zu verwenden, ohne die Schreibweise von PHP zu ändern.

Insgesamt ermöglicht uns HipHop, die besten Aspekte von PHP) beizubehalten und gleichzeitig die Leistungsvorteile von C++ zu nutzen. Insgesamt haben wir über 300.000 Codezeilen und mehr als 5.000 Komponententests geschrieben.

20
Trinidad

Kurze Antwort - nein, Sie brauchen kein C++.

Ich glaube, Sie beziehen sich auf HipHop . Wenn Sie über die Verbesserungen lesen, die es gibt, sind es ungefähr 50%. Dies ist sehr wichtig, wenn Sie Facebook mit Tausenden von Frontend-Servern sind. Wenn Sie die Last reduzieren, sparen Sie Millionen an Kosten für Rechenzentren. Bei Unternehmen mit 10 bis 100 Frontend-Servern würden die Entwicklungskosten mögliche Einsparungen erheblich übersteigen. Die schwerste Verarbeitung erfolgt jedoch im Back-End, bei dem es sich normalerweise um eine RDBMS- oder NoSQL-Lösung handelt, die als hochoptimierter C/C++ - Code entwickelt wurde.

Natürlich hätte das viel höhere Einsparungen erzielen können, wenn man nur das Dumping PHP vollständig). Aber das kann man mit einer riesigen Codebasis nicht machen, wie im Fall von Facebook.

Nun zu einem anderen Teil der Frage: Wenn Sie wirklich wissen möchten, wie man mit großen Lasten umgeht, lesen Sie den High Scalability Blog , insbesondere den Teil Real Life Architectures.

Es ist mit PHP möglich, aber definitiv nicht meine Wahl. Wenn Sie eine dynamische Sprache möchten, ist Python, Ruby oder vielleicht Lua die bessere Wahl.

13
vartec

Das Schöne an FBs Ansatz ist, dass sie sich nicht sofort entscheiden mussten. Do solltest das auch machen. Wählen Sie die Sprache, die Sie am produktivsten macht, aber stellen Sie sicher, dass sie problemlos mit C/C++ kompatibel ist.

Sobald Sie Millionen von Benutzern haben und die Antwortzeiten um Millisekunden verkürzen müssen, können Sie kritische Pfade mit C/C++ optimieren.

6
Scant Roger

Das von Facebook verwendete C++ - Element ist die HHVM.

Das ist die virtuelle HIPHOP-Maschine. Obwohl in C++ geschrieben, ist es im Wesentlichen ein "besserer PHP Interpreter").

Der PHP-Code wird zu Byte-Code kompiliert, der dann zur Ausführungszeit von der HHVM interpretiert wird und während der Ausführung "Just In Time" -Optimierungen unterzogen wird.

Die Entwickler von Facebook schreiben immer noch hauptsächlich in PHP, und was Sie in Ihrem Browser sehen, wird mit ziemlicher Sicherheit von einem PHP - Programm ausgegeben - obwohl es von der HHVM-Laufzeit kompiliert und interpretiert wurde .

Die eigentliche HHVM ist Open Source frei verfügbar. Wenn Sie also eine Million süße Kätzchenbilder pro Stunde bereitstellen müssen, können Sie die HHVM herunterladen und Ihren Server mit minimalen Änderungen an Ihrem PHP beschleunigen.

0
James Anderson