{"id":35722,"date":"2019-10-31T22:05:58","date_gmt":"2019-10-31T19:05:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\/"},"modified":"2019-10-31T22:05:58","modified_gmt":"2019-10-31T19:05:58","slug":"roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP ist nicht daf\u00fcr gemacht, zu sterben, oder Golang eilt zur Hilfe","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht daf\u00fcr gemacht, zu sterben, oder Golang eilt zur Hilfe\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHallo, Habr! Wir bei Badoo arbeiten aktiv <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">an der Performance von PHP<\/a><\/noindex>, da wir ein ziemlich gro\u00dfes System in dieser Sprache haben und das Thema Performance \u2013 eine Frage der Kosten ist. Vor \u00fcber zehn Jahren haben wir daf\u00fcr PHP-FPM entwickelt, das zuerst eine Sammlung von Patches f\u00fcr PHP war und sp\u00e4ter in die offizielle Lieferung aufgenommen wurde.<\/p>\n<p>In den letzten Jahren hat sich PHP stark weiterentwickelt: Der Garbage Collector hat sich verbessert, die Stabilit\u00e4t ist gestiegen \u2013 heute kann man mit PHP ohne gr\u00f6\u00dfere Probleme Daemons und langlebige Skripte schreiben. Das hat es Spiral Scout erm\u00f6glicht, weiterzugehen: RoadRunner bereinigt im Gegensatz zu PHP-FPM den Speicher nicht zwischen den Anfragen, was einen zus\u00e4tzlichen Leistungsvorteil bringt (obwohl dieser Ansatz den Entwicklungsprozess komplizierter macht). Wir experimentieren derzeit mit diesem Werkzeug, haben aber noch keine Ergebnisse, die wir teilen k\u00f6nnten. Um die Wartezeit etwas unterhaltsamer zu gestalten, <b>ver\u00f6ffentlichen wir die \u00dcbersetzung der Ank\u00fcndigung von RoadRunner von Spiral Scout.<\/b><\/p>\n<p>Der Ansatz aus dem Artikel spricht uns an: Bei der L\u00f6sung unserer eigenen Aufgaben verwenden wir ebenfalls h\u00e4ufiger die Kombination aus PHP und Go und profitieren von den Vorteilen beider Sprachen, ohne auf die eine zugunsten der anderen verzichten zu m\u00fcssen.<\/p>\n<p>Viel Spa\u00df!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>In den letzten zehn Jahren haben wir Anwendungen sowohl f\u00fcr Unternehmen aus der Liste <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, als auch f\u00fcr Gesch\u00e4fte mit einer Benutzerzahl von weniger als 500 entwickelt. W\u00e4hrend dieser ganzen Zeit haben unsere Ingenieure den Backend haupts\u00e4chlich in PHP entwickelt. Vor zwei Jahren jedoch hat etwas nicht nur die Performance unserer Produkte, sondern auch deren Skalierbarkeit stark beeinflusst \u2013 wir haben Golang (Go) in unseren Technologie-Stack eingef\u00fchrt.<\/p>\n<p>Fast sofort haben wir festgestellt, dass Go es uns erlaubt, gr\u00f6\u00dfere Anwendungen mit einer Leistungssteigerung von bis zu 40 Mal zu erstellen. Mit seiner Hilfe konnten wir bestehende Produkte, die in PHP geschrieben sind, erweitern und durch die Kombination der Vorteile beider Sprachen verbessern.<\/p>\n<p>Wir werden erkl\u00e4ren, wie die Kombination von Go und PHP hilft, reale Entwicklungsaufgaben zu l\u00f6sen und wie sie f\u00fcr uns zu einem Werkzeug geworden ist, das einige Probleme im Zusammenhang mit der <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">PHP 'Sterbens'-Modell<\/a><\/noindex>.<\/p>\n<h3>Ihrer typischen PHP-Entwicklungsumgebung<\/h3>\n<p>\nBevor wir erl\u00e4utern, wie man mit Go das 'Sterbens'-Modell von PHP wiederbeleben kann, werfen wir einen Blick auf Ihre Standard-PHP-Entwicklungsumgebung.<\/p>\n<p>In den meisten F\u00e4llen starten Sie die Anwendung mit einer Kombination aus dem Webserver nginx und dem PHP-FPM-Server. Der erste dient der Bereitstellung statischer Dateien und leitet spezifische Anfragen an PHP-FPM weiter, w\u00e4hrend PHP-FPM den PHP-Code ausf\u00fchrt. M\u00f6glicherweise verwenden Sie eine weniger beliebte Kombination aus Apache und mod_php. Auch wenn sie etwas anders funktioniert, sind die Prinzipien dieselben.<\/p>\n<p>Betrachten wir, wie PHP-FPM den Code der Anwendung ausf\u00fchrt. Wenn eine Anfrage eingeht, initialisiert PHP-FPM einen untergeordneten PHP-Prozess und \u00fcbertr\u00e4gt die Einzelheiten der Anfrage als Teil seines Zustands (_GET, _POST, _SERVER usw.). <\/p>\n<p>Der Zustand kann w\u00e4hrend der Ausf\u00fchrung des PHP-Skripts nicht ge\u00e4ndert werden, daher kann ein neuer Satz Eingabedaten nur auf eine Weise erlangt werden: durch das Leeren des Prozessspeichers und das Neuinitialisieren des Prozesses.<\/p>\n<p>Dieses Ausf\u00fchrungsmodell bietet viele Vorteile. Sie m\u00fcssen sich nicht \u00fcberm\u00e4\u00dfig um den Speicherverbrauch k\u00fcmmern, alle Prozesse sind vollst\u00e4ndig isoliert, und wenn einer davon \"stirbt\", wird er automatisch neu erstellt, ohne die anderen Prozesse zu beeintr\u00e4chtigen. Aber dieser Ansatz hat auch Nachteile, die sich beim Versuch zeigen, die Anwendung zu skalieren.<\/p>\n<h3>Nachteile und Ineffizienz der \u00fcblichen PHP-Umgebung<\/h3>\n<p>\nWenn Sie professionell mit PHP entwickeln, wissen Sie, wie wichtig es ist, ein neues Projekt mit der Auswahl des Frameworks zu beginnen. Es besteht aus Bibliotheken f\u00fcr Dependency Injection, ORMs, \u00dcbersetzungen und Templates. Und nat\u00fcrlich k\u00f6nnen alle eingehenden Benutzerdaten bequem in einem Objekt zusammengefasst werden (Symfony\/HttpFoundation oder PSR-7). Frameworks sind gro\u00dfartig!<\/p>\n<p>Aber alles hat seinen Preis. In jedem Framework auf Unternehmensebene m\u00fcssen f\u00fcr die Verarbeitung einer einfachen Benutzeranfrage oder eines Datenbankzugriffs mindestens Dutzende von Dateien geladen, zahlreiche Klassen erstellt und mehrere Konfigurationen analysiert werden. Noch schlimmer ist, dass nach jeder Aufgabe alles zur\u00fcckgesetzt werden muss, und man von vorne anfangen muss: Der gesamte Code, den Sie gerade initiiert haben, wird nutzlos, da Sie mit ihm kein weiteres Anfrage mehr bearbeiten k\u00f6nnen. Sagen Sie das irgendeinem Programmierer, der in einer anderen Sprache schreibt, und Sie werden das Unverst\u00e4ndnis auf seinem Gesicht sehen.<\/p>\n<p>PHP-Entwickler haben jahrelang nach L\u00f6sungen f\u00fcr dieses Problem gesucht und durchdachte Methoden des \"Lazy Loading\", Mikroframeworks, optimierte Bibliotheken, Caching usw. verwendet. Aber letztendlich m\u00fcssen sie die gesamte Anwendung trotzdem immer wieder zur\u00fccksetzen und von vorne beginnen.<i> (Hinweis des \u00dcbersetzers: Teilweise wird dieses Problem mit dem Erscheinen <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> in PHP 7.4)<\/p>\n<h3>Kann PHP mit Go mehr als eine Anfrage gleichzeitig verarbeiten?<\/h3>\n<p>\n<\/i>Es ist m\u00f6glich, PHP-Skripte zu schreiben, die l\u00e4nger als einige Minuten (von Stunden bis Tagen) leben: zum Beispiel Cron-Jobs, CSV-Parser oder Warteschlangen-Analyzer. Alle arbeiten nach demselben Schema: Sie holen die Aufgabe ab, f\u00fchren sie aus und warten auf die n\u00e4chste. Der Code bleibt st\u00e4ndig im Speicher, wodurch wertvolle Millisekunden gespart werden, da beim Laden von Framework und Anwendung zahlreiche zus\u00e4tzliche Schritte erforderlich sind.<\/p>\n<p>Einen langlebigen Skript zu entwickeln, ist jedoch nicht so einfach. Jeder Fehler kann den Prozess vollst\u00e4ndig stoppen, die Diagnose von Speicherlecks kann frustrierend sein, und Debugging durch F5 kann nicht mehr verwendet werden.<\/p>\n<p>Die Situation hat sich mit der Einf\u00fchrung von PHP 7 verbessert: Ein zuverl\u00e4ssiger Garbage Collector wurde eingef\u00fchrt, die Fehlerbehandlung ist einfacher geworden, und die Kern-Erweiterungen sind nun gegen Speicherlecks gesch\u00fctzt. Allerdings m\u00fcssen Ingenieure weiterhin vorsichtig mit dem Speicher umgehen und auf Probleme im Code achten (gibt es eine Sprache, in der man diesen Aspekt ignorieren kann?). Dennoch gibt es in PHP 7 weniger unerwartete \u00dcberraschungen.<\/p>\n<p>Kann man das Modell f\u00fcr langlebige PHP-Skripte nehmen, es f\u00fcr trivialere Aufgaben wie die Verarbeitung von HTTP-Anfragen anpassen und damit die Notwendigkeit beseitigen, bei jeder Anfrage alles neu zu laden?<\/p>\n<p>Um diese Aufgabe zu l\u00f6sen, musste zuerst eine serverseitige Anwendung implementiert werden, die in der Lage ist, HTTP-Anfragen zu empfangen und diese nacheinander an einen PHP-Worker weiterzuleiten, ohne ihn jedes Mal zu beenden.<\/p>\n<p>Wir wussten, dass wir einen Webserver in reinem PHP (PHP-PM) oder mit der C-Erweiterung (Swoole) schreiben konnten. Obwohl jeder Ansatz seine Vorteile hat, waren beide Optionen f\u00fcr uns unzureichend \u2013 wir wollten mehr. Wir ben\u00f6tigten nicht nur einen Webserver \u2013 wir strebten eine L\u00f6sung an, die uns von den Problemen des \"schweren Starts\" in PHP befreit, die gleichzeitig leicht anpassbar und erweiterbar f\u00fcr spezifische Anwendungen ist. Mit anderen Worten, wir ben\u00f6tigten einen Anwendungsserver.<\/p>\n<p>Kann Go dabei helfen? Wir wussten, dass es helfen kann, denn diese Sprache kompiliert Anwendungen in eigenst\u00e4ndige Bin\u00e4rdateien; sie ist plattform\u00fcbergreifend; nutzt ein sehr elegantes Modell der parallelen Verarbeitung (Concurrency) und eine Bibliothek f\u00fcr die HTTP-Verarbeitung; und schlie\u00dflich stehen uns Tausende von Open-Source-Bibliotheken und -Integrationen zur Verf\u00fcgung.<\/p>\n<h3>Die Schwierigkeiten bei der Kombination von zwei Programmiersprachen<\/h3>\n<p>\nZun\u00e4chst musste festgelegt werden, wie zwei oder mehr Anwendungen miteinander kommunizieren w\u00fcrden.<\/p>\n<p>Zum Beispiel \u00fcber<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> eine ausgezeichnete Bibliothek<\/a><\/noindex> von Alex Pal\u00e4stras k\u00f6nnte die gemeinsame Nutzung von Speicher zwischen PHP- und Go-Prozessen erm\u00f6glicht werden (\u00e4hnlich wie mod_php in Apache). Aber diese Bibliothek hat Eigenschaften, die ihre Verwendung f\u00fcr unser Anliegen einschr\u00e4nken.<\/p>\n<p>Wir entschieden uns, einen anderen, verbreitetere Ansatz zu w\u00e4hlen: die Interaktion zwischen Prozessen \u00fcber Sockets\/Pipelines zu erstellen. Dieser Ansatz hat sich in den letzten Jahrzehnten als zuverl\u00e4ssig erwiesen und wurde auf Betriebssystemebene gut optimiert.<\/p>\n<p>Zu Beginn erstellten wir ein einfaches bin\u00e4res Protokoll f\u00fcr den Datenaustausch zwischen Prozessen und die Behandlung von \u00dcbertragungsfehlern. In seiner einfachsten Form \u00e4hnelt ein Protokoll dieses Typs <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> c<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> mit einem Header von fester Gr\u00f6\u00dfe<\/a><\/noindex> (in unserem Fall 17 Byte), der Informationen \u00fcber den Pakettyp, seine Gr\u00f6\u00dfe und eine bin\u00e4re Maske zur \u00dcberpr\u00fcfung der Datenintegrit\u00e4t enth\u00e4lt.<\/p>\n<p>Auf der PHP-Seite verwendeten wir <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">die Funktion pack<\/a><\/noindex>, und auf der Go-Seite die Bibliothek<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Ein Protokoll erschien uns nicht ausreichend \u2013 und wir f\u00fcgten die M\u00f6glichkeit hinzu,<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> Go-Dienste net\/rpc direkt aus PHP<\/a><\/noindex>. Sp\u00e4ter half uns das sehr in der Entwicklung, da wir Go-Bibliotheken leicht in PHP-Anwendungen integrieren konnten. Das Ergebnis dieser Arbeit sehen Sie zum Beispiel in einem unserer anderen Open-Source-Produkte<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Aufteilung von Aufgaben auf mehrere PHP-Worker<\/h3>\n<p>\nNach der Implementierung des Interaktionsmechanismus haben wir dar\u00fcber nachgedacht, wie wir Aufgaben am effizientesten an die PHP-Prozesse \u00fcbergeben k\u00f6nnen. Wenn eine Aufgabe eintrifft, muss der Anwendungsserver einen freien Worker f\u00fcr deren Ausf\u00fchrung ausw\u00e4hlen. Wenn ein Worker\/Prozess mit einem Fehler beendet wurde oder \"gestorben\" ist, entfernen wir ihn und erstellen einen neuen Ersatz. Wenn jedoch der Worker\/Prozess erfolgreich abgeschlossen wurde, senden wir ihn zur\u00fcck in den Pool der verf\u00fcgbaren Worker zur Ausf\u00fchrung von Aufgaben.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht daf\u00fcr gemacht, zu sterben, oder Golang eilt zur Hilfe\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00fcr die Speicherung des Pools aktiver Worker haben wir<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> einen gepufferten Kanal<\/a><\/noindex>, um unerwartet \"gestorbene\" Worker aus dem Pool zu entfernen, haben wir einen Mechanismus zur Fehler- und Status\u00fcberwachung der Worker hinzugef\u00fcgt.<\/p>\n<p>So erhielten wir einen funktionierenden PHP-Server, der in der Lage ist, beliebige Anfragen, die in bin\u00e4rer Form vorliegen, zu verarbeiten.<\/p>\n<p>Damit unsere Anwendung als Webserver fungieren kann, mussten wir einen zuverl\u00e4ssigen PHP-Standard ausw\u00e4hlen, um alle eingehenden HTTP-Anfragen darzustellen. In unserem Fall <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">wandeln wir<\/a><\/noindex> net\/http-Anfragen aus Go in das Format<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, damit es mit den meisten der heute verf\u00fcgbaren PHP-Frameworks kompatibel ist.<\/p>\n<p>Da PSR-7 als unver\u00e4nderlich gilt (manche werden sagen, dass das technisch nicht so ist), m\u00fcssen Entwickler Anwendungen schreiben, die im Grunde nicht mit der Anfrage als globalem Objekt umgehen. Dies passt hervorragend zum Konzept von langlebigen PHP-Prozessen. Unsere endg\u00fcltige Implementierung, die noch keinen Namen hatte, sah folgenderma\u00dfen aus:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht daf\u00fcr gemacht, zu sterben, oder Golang eilt zur Hilfe\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Wir pr\u00e4sentieren RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> ein hochleistungsf\u00e4higer Server f\u00fcr PHP-Anwendungen<\/a><\/noindex><\/h3>\n<p>\nUnsere erste Testaufgabe war ein API-Backend, bei dem es zeitweise unvorhersehbare Anstiege bei den Anfragen gab (deutlich h\u00e4ufiger als gew\u00f6hnlich). Obwohl in den meisten F\u00e4llen die M\u00f6glichkeiten von nginx ausreichten, stie\u00dfen wir regelm\u00e4\u00dfig auf den Fehler 502, da wir das System nicht schnell genug an die erwartete Laststeigerung anpassen konnten.<\/p>\n<p>Zur L\u00f6sung dieses Problems setzten wir Anfang 2018 unseren ersten PHP\/Go-Anwendungsserver in Betrieb. Und sofort erzielten wir unglaubliche Ergebnisse! Wir haben nicht nur den Fehler 502 vollst\u00e4ndig eliminiert, sondern konnten auch die Anzahl der Server um zwei Drittel reduzieren und eine Menge Geld sowie Kopfschmerztabletten f\u00fcr Ingenieure und Produktmanager sparen.<\/p>\n<p>Bis zur Mitte des Jahres haben wir unsere L\u00f6sung verbessert, sie unter der MIT-Lizenz auf GitHub ver\u00f6ffentlicht und sie genannt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, wodurch ihre unglaubliche Geschwindigkeit und Effizienz hervorgehoben wird.<\/p>\n<h3>Wie RoadRunner Ihren Entwicklungs-Stack verbessern kann<\/h3>\n<p>\nAnwendung<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> wurde es uns erm\u00f6glicht, Middleware net\/http auf der Go-Seite zu verwenden, um die JWT-\u00dcberpr\u00fcfung bereits bevor die Anfrage in PHP eintrifft, durchzuf\u00fchren, sowie WebSockets zu verarbeiten und globalen Zustand in Prometheus zu aggregieren. <\/p>\n<p>Dank des eingebauten RPC k\u00f6nnen APIs beliebiger Go-Bibliotheken f\u00fcr PHP ohne das Schreiben von Wrapper-Erweiterungen ge\u00f6ffnet werden. Noch wichtiger ist, dass man mit RoadRunner neue Server bereitstellen kann, die sich von HTTP unterscheiden. Beispiele daf\u00fcr sind das Starten von PHP-Handlern<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, das Erstellen zuverl\u00e4ssiger Queue-Parser und sogar das Hinzuf\u00fcgen von<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> , w\u00fcrden Sie den Port<\/a><\/noindex> zu unseren Anwendungen.<\/p>\n<p>Mit Hilfe der Communities von PHP und Go haben wir die Stabilit\u00e4t der L\u00f6sung erh\u00f6ht, in einigen Tests die Anwendungsleistung um bis zu das 40-Fache gesteigert, die Debugging-Tools verbessert, die Integration mit dem Symfony-Framework umgesetzt und Unterst\u00fctzung f\u00fcr HTTPS, HTTP\/2, Plugins und PSR-17 hinzugef\u00fcgt.<\/p>\n<h3>Fazit<\/h3>\n<p>\nEinige sind immer noch gefangen in der veralteten Vorstellung, dass PHP eine langsame und schwerf\u00e4llige Sprache ist, die nur f\u00fcr die Entwicklung von Plugins f\u00fcr WordPress geeignet ist. Diese Leute k\u00f6nnten sogar sagen, dass PHP ein solches Limit hat: Wenn eine Anwendung gro\u00df genug wird, muss man eine \u201ereifere\u201c Sprache w\u00e4hlen und den \u00fcber viele Jahre angesammelten Code neu schreiben.<\/p>\n<p>Darauf m\u00f6chten wir antworten: Denken Sie noch einmal nach. Wir glauben, dass nur Sie selbst irgendwelche Einschr\u00e4nkungen f\u00fcr PHP setzen. Sie k\u00f6nnen Ihr ganzes Leben damit verbringen, von einer Sprache zur anderen zu wechseln, w\u00e4hrend Sie versuchen, die ideale Kombination f\u00fcr Ihre Bed\u00fcrfnisse zu finden, oder Sie k\u00f6nnen beginnen, Sprachen als Werkzeuge wahrzunehmen. Die scheinbaren Nachteile einer Sprache wie PHP k\u00f6nnen in Wirklichkeit die Gr\u00fcnde f\u00fcr ihren Erfolg sein. Und wenn man sie mit einer anderen Sprache wie Go kombiniert, wird man viel leistungsst\u00e4rkere Produkte schaffen, als wenn man sich auf eine einzige Sprache beschr\u00e4nkt.<\/p>\n<p>Nachdem wir mit der Kombination aus Go und PHP gearbeitet haben, k\u00f6nnen wir sagen, dass wir sie lieben gelernt haben. Wir planen nicht, eines zugunsten des anderen aufzugeben \u2013 im Gegenteil, wir werden nach Wegen suchen, noch mehr Nutzen aus diesem dualen Stack zu ziehen.<\/p>\n<p><i>UPD: Wir begr\u00fc\u00dfen den Sch\u00f6pfer von RoadRunner und Mitautor des urspr\u00fcnglichen Artikels \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/434272\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u0432 Badoo \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e PHP, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0434\u0435\u043d\u0435\u0433. \u0411\u043e\u043b\u0435\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e PHP-FPM, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0447\u0435\u0439 \u0434\u043b\u044f PHP, \u0430 \u043f\u043e\u0437\u0436\u0435 \u0432\u043e\u0448\u0451\u043b \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0443. \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b PHP \u0441\u0438\u043b\u044c\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26762,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47RoadRunner: PHP \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0438\u0440\u0430\u0442\u044c, \u0438\u043b\u0438 Golang \u0441\u043f\u0435\u0448\u0438\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:05:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:05:58+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47RoadRunner: PHP wurde nicht entwickelt, um zu sterben, oder Golang kommt zur Rettung | ProHoster","description":"Hallo, Habra!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47RoadRunner: PHP \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0438\u0440\u0430\u0442\u044c, \u0438\u043b\u0438 Golang \u0441\u043f\u0435\u0448\u0438\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:05:58+00:00","article:modified_time":"2019-10-31T19:05:58+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35722","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 00:30:57","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:57:45","updated":"2026-01-22 00:30:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}