{"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 dazu gemacht, zu sterben, oder Golang kommt zur Hilfe","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht dazu gemacht, zu sterben, oder Golang kommt zur Hilfe\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHallo, Habr! Bei Badoo arbeiten wir 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 die Leistungsf\u00e4higkeit eine Frage der Kosteneffizienz ist. Vor \u00fcber zehn Jahren haben wir daf\u00fcr PHP-FPM entwickelt, das zun\u00e4chst eine Sammlung von Patches f\u00fcr PHP war und sp\u00e4ter in die offizielle Distribution aufgenommen wurde.<\/p>\n<p>In den letzten Jahren hat sich PHP stark weiterentwickelt: der Garbage Collector wurde verbessert, und die Stabilit\u00e4t ist gestiegen \u2013 heute ist es problemlos m\u00f6glich, Daemons und langlebige Skripte in PHP zu schreiben. Das hat es Spiral Scout erm\u00f6glicht, einen Schritt weiter zu gehen: Im Gegensatz zu PHP-FPM r\u00e4umt RoadRunner den Speicher zwischen den Anfragen nicht auf, was einen zus\u00e4tzlichen Leistungsgewinn bringt (obwohl dieser Ansatz den Entwicklungsprozess komplizierter macht). Wir experimentieren derzeit mit diesem Tool, haben aber noch keine Ergebnisse, die wir teilen k\u00f6nnten. Um das Warten angenehmer zu gestalten, <b>ver\u00f6ffentlichen wir die \u00dcbersetzung der RoadRunner-Ank\u00fcndigung von Spiral Scout.<\/b><\/p>\n<p>Der Ansatz in dem Artikel ist uns \u00e4hnlich: Bei der L\u00f6sung unserer Aufgaben verwenden wir ebenfalls h\u00e4ufig die Kombination aus PHP und Go, wodurch wir die Vorteile beider Sprachen nutzen k\u00f6nnen, ohne eine f\u00fcr die andere aufzugeben.<\/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 auf der Liste der <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, als auch f\u00fcr Gesch\u00e4ftsmodelle mit weniger als 500 Nutzern entwickelt. W\u00e4hrend dieser Zeit haben unsere Ingenieure haupts\u00e4chlich den Backend-Bereich mit PHP gestaltet. Vor zwei Jahren haben wir jedoch eine bedeutende Ver\u00e4nderung erlebt, die nicht nur die Leistung unserer Produkte, sondern auch deren Skalierbarkeit erheblich beeinflusste \u2013 wir haben Golang (Go) in unseren Technologiestack integriert.<\/p>\n<p>Fast sofort stellten wir fest, dass Go es uns erm\u00f6glicht, gr\u00f6\u00dfere Anwendungen zu erstellen und die Leistung um das 40-Fache zu steigern. Damit konnten wir bestehende Produkte, die in PHP geschrieben waren, erweitern und sie durch eine Kombination der Vorteile beider Sprachen verbessern.<\/p>\n<p>Wir werden erl\u00e4utern, wie die Verbindung von Go und PHP uns hilft, reale Entwicklungsprobleme zu l\u00f6sen und wie sie f\u00fcr uns zu einem Werkzeug geworden ist, das uns von Teilen der Probleme befreien kann, die mit <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">dem \u201eSterben\u201c von PHP<\/a><\/noindex>.<\/p>\n<h3>Ihrer allt\u00e4glichen PHP-Entwicklungsumgebung<\/h3>\n<p>\nBevor wir erl\u00e4utern, wie Go das Modell des \u201eSterbens\u201c von PHP wiederbeleben kann, lassen Sie uns zun\u00e4chst Ihre Standard-PHP-Entwicklungsumgebung betrachten.<\/p>\n<p>In den meisten F\u00e4llen starten Sie Ihre Anwendung mit einer Kombination aus dem Webserver nginx und dem PHP-FPM-Server. Der erstgenannte bedient statische Dateien und leitet spezifische Anfragen an PHP-FPM weiter, w\u00e4hrend PHP-FPM den PHP-Code ausf\u00fchrt. M\u00f6glicherweise verwenden Sie eine weniger verbreitete Kombination aus Apache und mod_php. Auch wenn sie etwas anders funktioniert, bleiben die Prinzipien die gleichen.<\/p>\n<p>Betrachten wir, wie PHP-FPM den Anwendungscode ausf\u00fchrt. Wenn eine Anfrage eingeht, initialisiert PHP-FPM einen Kindprozess f\u00fcr PHP und \u00fcbergibt die Details 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 ver\u00e4ndert werden, daher gibt es nur einen Weg, um einen neuen Satz von Eingabedaten zu erhalten: den Arbeitsspeicher des Prozesses zu leeren und ihn neu zu initialisieren.<\/p>\n<p>Dieses Ausf\u00fchrungsmodell bietet viele Vorteile. Sie m\u00fcssen sich keine gro\u00dfen Sorgen um den Speicherverbrauch machen, alle Prozesse sind vollst\u00e4ndig isoliert, und wenn einer von ihnen 'stirbt', wird er automatisch neu erstellt, ohne die anderen Prozesse zu beeintr\u00e4chtigen. Allerdings gibt es auch Nachteile, die sich bei der Skalierung der Anwendung zeigen.<\/p>\n<h3>Nachteile und Ineffizienz einer herk\u00f6mmlichen PHP-Umgebung<\/h3>\n<p>\nWenn Sie professionell mit PHP entwickeln, wissen Sie, wo Sie bei einem neuen Projekt anfangen m\u00fcssen \u2013 bei der Auswahl eines Frameworks. Es handelt sich um Bibliotheken f\u00fcr Dependency Injection, ORM, \u00dcbersetzungen und Templates. Und nat\u00fcrlich k\u00f6nnen Sie alle benutzereingaben bequem in ein einziges Objekt (Symfony\/HttpFoundation oder PSR-7) unterbringen. Frameworks sind gro\u00dfartig!<\/p>\n<p>Aber alles hat seinen Preis. Bei jedem Enterprise-Level-Framework m\u00fcssen Sie f\u00fcr die Verarbeitung einer einfachen Benutzeranfrage oder einer Datenbankabfrage mindestens Dutzende von Dateien laden, zahlreiche Klassen erstellen und mehrere Konfigurationen parsen. Noch schlimmer ist, dass Sie nach Abschluss jeder Aufgabe alles zur\u00fccksetzen und von vorne anfangen m\u00fcssen: Der Code, den Sie gerade initialisiert haben, ist dann nutzlos und kann f\u00fcr eine weitere Anfrage nicht verwendet werden. Erz\u00e4hlen Sie das einem Programmierer, der in einer anderen Sprache arbeitet, und Sie werden das Erstaunen auf seinem Gesicht sehen.<\/p>\n<p>PHP-Entwickler haben jahrelang nach L\u00f6sungen f\u00fcr dieses Problem gesucht und durchdachte Methoden wie \"Lazy Loading\", Microframeworks, optimierte Bibliotheken, Caching usw. verwendet. Letztendlich bleibt jedoch oft keine andere Wahl, als die gesamte Anwendung zur\u00fcckzusetzen und von vorne zu beginnen, immer wieder.<i> (Anmerkung des \u00dcbersetzers: Teilweise wird dieses Problem mit der Einf\u00fchrung <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> in PHP 7.4) durch die neuen Funktionen gel\u00f6st.<\/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 nur einige Minuten laufen (bis zu Stunden oder sogar Tagen): zum Beispiel Cron-Jobs, CSV-Parser oder Queue-Manager. All diese Tools funktionieren nach dem gleichen Prinzip: Sie ziehen eine Aufgabe, f\u00fchren sie aus und warten auf die n\u00e4chste. Der Code bleibt dauerhaft im Speicher, was wertvolle Millisekunden spart, da das Laden des Frameworks und der Anwendung zahlreiche zus\u00e4tzliche Schritte erfordert.<\/p>\n<p>Doch das Entwickeln von langlebigen Skripten ist nicht so einfach. Jeder Fehler kann den Prozess vollst\u00e4ndig zum Stillstand bringen, die Diagnose von Speicherlecks kann frustrierend sein, und eine F5-Debugging kann nicht mehr verwendet werden.<\/p>\n<p>Die Situation hat sich mit der Einf\u00fchrung von PHP 7 verbessert: Es gibt jetzt einen zuverl\u00e4ssigen Garbage Collector, das Fehlerhandling ist einfacher und die Kernel-Erweiterungen sind nun vor Speicherlecks gesch\u00fctzt. Dennoch m\u00fcssen Ingenieure weiterhin sorgf\u00e4ltig mit dem Speicher umgehen und potenzielle Zustandsprobleme im Code beachten (gibt es eine Programmiersprache, bei der man darauf nicht achten muss?). Trotzdem erwarten uns in PHP 7 weniger \u00dcberraschungen.<\/p>\n<p>Kann man das Modell der langlebigen PHP-Skripte nehmen, es f\u00fcr trivialere Aufgaben wie die Verarbeitung von HTTP-Anfragen anpassen und so die Notwendigkeit beseitigen, bei jeder Anfrage alles neu zu laden?<\/p>\n<p>Um dieses Ziel zu erreichen, musste zun\u00e4chst eine Serveranwendung implementiert werden, die in der Lage ist, HTTP-Anfragen anzunehmen und diese nacheinander an einen PHP-Worker weiterzuleiten, ohne ihn dabei jedes Mal neu zu starten.<\/p>\n<p>Wir wussten, dass wir einen Webserver mit reinem PHP (PHP-PM) oder mit einer C-Erweiterung (Swoole) schreiben k\u00f6nnten. Obwohl jede Methode ihre Vorteile hat, waren beide Optionen nicht das, was wir suchten \u2013 wir wollten mehr. Wir ben\u00f6tigten nicht einfach einen Webserver \u2013 wir strebten eine L\u00f6sung an, die uns von den Problemen des \u00bbschweren Starts\u00ab in PHP befreit und sich leicht an spezifische Anwendungen anpassen und erweitern l\u00e4sst. Das hei\u00dft, wir brauchten einen Anwendungsserver.<\/p>\n<p>Kann Go dabei helfen? Wir wussten, dass es das kann, denn die Sprache kompiliert Anwendungen in einzelne bin\u00e4re Dateien; sie ist plattform\u00fcbergreifend; verwendet ein eigenes, sehr elegantes Modell f\u00fcr parallele Verarbeitung (Concurrency) und eine Bibliothek zur Arbeit mit HTTP; und schlie\u00dflich stehen uns tausende von Open-Source-Bibliotheken und Integrationen zur Verf\u00fcgung.<\/p>\n<h3>Herausforderungen der Kombination von zwei Programmiersprachen<\/h3>\n<p>\nZun\u00e4chst musste festgelegt werden, wie zwei oder mehr Anwendungen miteinander kommunizieren.<\/p>\n<p>Zum Beispiel mit<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> einer gro\u00dfartigen Bibliothek<\/a><\/noindex> Die Nutzung von Alexa Pal\u00e6stras erm\u00f6glichte die gemeinsame Nutzung des Speichers zwischen den PHP- und Go-Prozessen (\u00e4hnlich wie mod_php in Apache). Allerdings hat diese Bibliothek Einschr\u00e4nkungen, die ihre Anwendung f\u00fcr unsere L\u00f6sung begrenzen.<\/p>\n<p>Wir entschieden uns f\u00fcr einen anderen, weit verbreiteten Ansatz: die Interaktion zwischen den Prozessen \u00fcber Sockets\/Pipelines zu gestalten. Dieser Ansatz hat sich \u00fcber die letzten Jahrzehnte als zuverl\u00e4ssig erwiesen und wurde auf Betriebssystemebene gut optimiert.<\/p>\n<p>Zun\u00e4chst erstellten wir ein einfaches bin\u00e4res Protokoll zum Datenaustausch zwischen den Prozessen und zur Fehlerbehandlung. In seiner einfachsten Form \u00e4hnelt dieses Protokoll einem <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">Netstring<\/a><\/noindex> mit<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> mit einem festen Paketheader<\/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 die <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">pack-Funktion<\/a><\/noindex>, w\u00e4hrend wir 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>verwendeten. Ein einzelnes Protokoll erschien uns als unzureichend \u2013 daher f\u00fcgten wir 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 aufzurufen.<\/a><\/noindex>. Sp\u00e4ter hat uns das bei der Entwicklung sehr geholfen, da wir Go-Bibliotheken leicht in PHP-Anwendungen integrieren konnten. Das Ergebnis dieser Arbeit ist beispielsweise in einem anderen unserer Open-Source-Produkte sichtbar.<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 dachten wir dar\u00fcber nach, wie wir Aufgaben am effizientesten an die PHP-Prozesse \u00fcbergeben k\u00f6nnen. Wenn eine Aufgabe eintrifft, muss der Anwendungsserver einen freien Worker zur Bearbeitung ausw\u00e4hlen. Falls der Worker\/Prozess mit einem Fehler beendet wurde oder \u201agestorben\u2018 ist, entfernen wir ihn und erstellen einen neuen. Hat der Worker\/Prozess erfolgreich gearbeitet, wird er wieder in den Pool der zur Verf\u00fcgung stehenden Worker zur\u00fcckgegeben.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht dazu gemacht, zu sterben, oder Golang kommt zur Hilfe\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00fcr die Verwaltung 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>, hinzugef\u00fcgt, um unerwartet \u201agestorbene\u2018 Worker durch einen Mechanismus zur Fehler- und Status\u00fcberwachung aus dem Pool zu entfernen.<\/p>\n<p>Somit haben wir einen funktionierenden PHP-Server erhalten, der in der Lage ist, beliebige, bin\u00e4r dargestellte Anfragen zu verarbeiten.<\/p>\n<p>Damit unsere Anwendung als Webserver funktioniert, mussten wir einen zuverl\u00e4ssigen PHP-Standard zur Darstellung von eingehenden HTTP-Anfragen w\u00e4hlen. 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 heute verf\u00fcgbaren PHP-Frameworks kompatibel ist.<\/p>\n<p>Da PSR-7 als unver\u00e4nderlich angesehen wird (technisch nicht ganz korrekt), m\u00fcssen Entwickler Anwendungen schreiben, die Anfragen nicht als globale Entit\u00e4t behandeln. Dies passt hervorragend zum Konzept von langlebigen PHP-Prozessen. Unsere endg\u00fcltige Implementierung, die noch keinen Namen hat, sah so aus:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ist nicht dazu gemacht, zu sterben, oder Golang kommt 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 hochperformanter Server f\u00fcr PHP-Anwendungen<\/a><\/noindex><\/h3>\n<p>\nUnsere erste Testaufgabe war ein API-Backend, bei dem gelegentlich unvorhersehbare Anstiege bei den Anfragen auftraten (viel h\u00e4ufiger als gew\u00f6hnlich). Obwohl die M\u00f6glichkeiten von nginx in den meisten F\u00e4llen ausreichten, standen wir regelm\u00e4\u00dfig vor dem Fehler 502, weil wir das System nicht schnell genug auf die erwartete erh\u00f6hte Last ausbalancieren konnten.<\/p>\n<p>Um diese L\u00f6sung zu ersetzen, haben wir Anfang 2018 unseren ersten PHP\/Go-Anwendungsserver bereitgestellt. Und sofort erzielten wir unglaubliche Ergebnisse! Wir haben nicht nur den Fehler 502 vollst\u00e4ndig beseitigt, sondern konnten auch die Anzahl der Server um zwei Drittel reduzieren, wodurch wir eine Menge Geld und viele Kopfschmerztabletten f\u00fcr unsere Ingenieure und Produktmanager gespart haben.<\/p>\n<p>Mitte des Jahres verbesserten wir unsere L\u00f6sung, ver\u00f6ffentlichten sie auf GitHub unter der MIT-Lizenz und nannten sie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, was seine unglaubliche Geschwindigkeit und Effizienz unterstreicht.<\/p>\n<h3>Wie RoadRunner Ihren Entwicklungsstack verbessern kann<\/h3>\n<p>\nAnwendung<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> erlaubte es uns, das Middleware net\/http auf der Go-Seite zu nutzen, um die JWT-\u00dcberpr\u00fcfung bereits durchzuf\u00fchren, bevor die Anfrage PHP erreicht, sowie um WebSockets zu verarbeiten und globalen Zustand in Prometheus zu aggregieren. <\/p>\n<p>Dank des eingebauten RPC k\u00f6nnen wir APIs beliebiger Go-Bibliotheken f\u00fcr PHP \u00f6ffnen, ohne Wrapper-Erweiterungen schreiben zu m\u00fcssen. Was noch wichtiger ist, k\u00f6nnen mit RoadRunner neue Server bereitgestellt werden, die sich von HTTP unterscheiden. Beispielsweise k\u00f6nnen PHP-Handler gestartet werden,<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>robuste Queue-Parser erstellt und sogar<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> in unsere Anwendungen aufgenommen werden.<\/p>\n<p>Durch die Community-Entwicklungen in PHP und Go haben wir die Stabilit\u00e4t unserer L\u00f6sung verbessert. In einigen Tests konnten wir die Anwendungsleistung um das 40-Fache steigern, Debugging-Tools optimieren, die Integration mit dem Symfony-Framework umsetzen und Unterst\u00fctzung f\u00fcr HTTPS, HTTP\/2, Plugins und PSR-17 hinzuf\u00fcgen.<\/p>\n<h3>Fazit<\/h3>\n<p>\nEinige bleiben immer noch in der veralteten Vorstellung gefangen, dass PHP eine langsame und schwerf\u00e4llige Sprache ist, die nur f\u00fcr die Entwicklung von WordPress-Plugins geeignet ist. Diese Personen k\u00f6nnten sogar behaupten, dass PHP eine solche Einschr\u00e4nkung hat: Wenn eine Anwendung gro\u00df genug wird, muss man auf eine \u201ereifere\u201c Sprache wechseln und den \u00fcber viele Jahre gewachsenen Code neu schreiben.<\/p>\n<p>Darauf m\u00f6chten wir antworten: Denken Sie noch einmal nach. Wir sind der Meinung, 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 perfekte Kombination f\u00fcr Ihre Bed\u00fcrfnisse zu finden, oder Sie k\u00f6nnen beginnen, Sprachen als Werkzeuge zu betrachten. Die vermeintlichen Nachteile von PHP k\u00f6nnen tats\u00e4chlich Gr\u00fcnde f\u00fcr seinen Erfolg sein. Wenn Sie es mit einer anderen Sprache wie Go kombinieren, schaffen Sie viel leistungsf\u00e4higere Produkte, als wenn Sie sich auf eine einzige Sprache beschr\u00e4nken.<\/p>\n<p>Nach der Arbeit mit der Kombination aus Go und PHP k\u00f6nnen wir sagen, dass wir sie lieben gelernt haben. Wir haben nicht vor, auf eine der beiden zugunsten der anderen zu verzichten \u2013 ganz im Gegenteil, wir werden nach Wegen suchen, um noch mehr aus diesem Dual-Stack herauszuholen.<\/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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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) 4.9.10\" \/>\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! \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\" \/>\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 geschaffen, um zu stagnieren, oder Golang eilt zur Hilfe | ProHoster","description":"Hallo, Habr! Bei Badoo arbeiten wir intensiv an der Performance von PHP, da wir ein gro\u00dfes System auf dieser Sprache betreiben und die Leistungsf\u00e4higkeit eine Kostenfrage ist. Vor \u00fcber zehn Jahren haben wir daf\u00fcr PHP-FPM entwickelt, das zun\u00e4chst eine Sammlung von Patches f\u00fcr PHP war und sp\u00e4ter in die offizielle Distribution aufgenommen wurde. In den letzten Jahren hat sich PHP stark verbessert.","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! \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","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"},"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}]}}