{"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\/da\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP er ikke skabt til at d\u00f8, eller Golang skynder sig til unds\u00e6tning","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP er ikke skabt til at d\u00f8, eller Golang skynder sig til unds\u00e6tning\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHej, Habr! Vi i Badoo arbejder aktivt <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">p\u00e5 PHP-ydeevnen<\/a><\/noindex>, da vi har et ret stort system p\u00e5 dette sprog, og sp\u00f8rgsm\u00e5let om ydeevne er et sp\u00f8rgsm\u00e5l om penge. For over ti \u00e5r siden skabte vi PHP-FPM, som i starten var et s\u00e6t patches til PHP, men senere blev en del af den officielle distribution.<\/p>\n<p>I de seneste \u00e5r har PHP gjort store fremskridt: affaldsindsamleren er blevet forbedret, stabiliteten er \u00f8get - i dag kan man skrive d\u00e6moner og langvarige scripts p\u00e5 PHP uden s\u00e6rlige problemer. Dette har givet Spiral Scout mulighed for at g\u00e5 videre: RoadRunner, i mods\u00e6tning til PHP-FPM, rydder ikke hukommelsen mellem anmodninger, hvilket giver en ekstra ydeevnegevinst (selvom denne tilgang komplicerer udviklingsprocessen). Vi eksperimenterer i \u00f8jeblikket med dette v\u00e6rkt\u00f8j, men vi har stadig ikke resultater at dele. For at g\u00f8re ventetiden sjovere, <b>offentligg\u00f8r vi overs\u00e6ttelsen af RoadRunner-annoncen fra Spiral Scout.<\/b><\/p>\n<p>Tilgangen i artiklen er n\u00e6r vores: n\u00e5r vi l\u00f8ser vores opgaver, bruger vi ogs\u00e5 oftest kombinationen af PHP og Go, hvilket giver os fordele fra begge sprog uden at give afkald p\u00e5 det ene til fordel for det andet.<\/p>\n<p>God forn\u00f8jelse!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>I de seneste ti \u00e5r har vi skabt applikationer til b\u00e5de virksomheder p\u00e5 listen <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, og til virksomheder med en brugergruppe p\u00e5 h\u00f8jst 500. I hele denne tid har vores ingeni\u00f8rer prim\u00e6rt udviklet backend i PHP. Men for to \u00e5r siden p\u00e5virkede noget st\u00e6rkt ikke kun ydeevnen af vores produkter, men ogs\u00e5 deres skal\u00e9rbarhed - vi introducerede Golang (Go) i vores teknologistak.<\/p>\n<p>Vi opdagede straks, at Go giver os mulighed for at skabe st\u00f8rre applikationer med en ydeevnefor\u00f8gelse p\u00e5 op til 40 gange. Med det kunne vi udvide eksisterende produkter skrevet i PHP, hvilket forbedrede dem ved hj\u00e6lp af en kombination af fordele fra begge sprog.<\/p>\n<p>Vi vil fort\u00e6lle, hvordan kombinationen af Go og PHP hj\u00e6lper med at l\u00f8se reelle udviklingsopgaver, og hvordan det er blevet et v\u00e6rkt\u00f8j for os, der kan hj\u00e6lpe med at afhj\u00e6lpe nogle af problemerne relateret til <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">modellen 'd\u00f8ende' PHP<\/a><\/noindex>.<\/p>\n<h3>Din daglige PHP-udviklingsmilj\u00f8<\/h3>\n<p>\nF\u00f8r vi fort\u00e6ller, hvordan man kan genoplive modellen 'd\u00f8ende' PHP med Go, lad os se p\u00e5 dit standard PHP-udviklingsmilj\u00f8.<\/p>\n<p>I de fleste tilf\u00e6lde k\u00f8rer du en applikation ved hj\u00e6lp af en kombination af webserveren nginx og PHP-FPM-serveren. Den f\u00f8rste serverer statiske filer og omdirigerer specifikke anmodninger til PHP-FPM, som selv udf\u00f8rer PHP-koden. M\u00e5ske bruger du en mindre popul\u00e6r kombination af Apache og mod_php. Men selvom den fungerer lidt anderledes, er principperne de samme.<\/p>\n<p>Lad os se p\u00e5, hvordan PHP-FPM udf\u00f8rer applikationskoden. N\u00e5r en anmodning modtages, initialiserer PHP-FPM en underliggende PHP-proces og sender detaljerne i anmodningen som en del af dens tilstand (_GET, _POST, _SERVER osv.). <\/p>\n<p>Tilstanden kan ikke \u00e6ndres under udf\u00f8relsen af PHP-scriptet, s\u00e5 for at f\u00e5 et nyt s\u00e6t inputdata skal du g\u00f8re det p\u00e5 \u00e9n m\u00e5de: rydde hukommelsen i processen og initialisere den igen.<\/p>\n<p>Denne udf\u00f8relsesmodel har mange fordele. Du beh\u00f8ver ikke at bekymre dig meget om hukommelsesforbruget, alle processer er fuldst\u00e6ndigt isolerede, og hvis en af dem \"d\u00f8r\", vil den automatisk blive genskabt, og dette vil ikke p\u00e5virke de andre processer. Men denne tilgang har ogs\u00e5 ulemper, der viser sig, n\u00e5r du fors\u00f8ger at skalere applikationen.<\/p>\n<h3>Ulemperne og ineffektiviteten i den almindelige PHP-milj\u00f8<\/h3>\n<p>\nHvis du besk\u00e6ftiger dig med professionel PHP-udvikling, ved du, hvor du skal starte et nyt projekt - med valget af et framework. Det er biblioteker til afh\u00e6ngighedsinjektion, ORM'er, overs\u00e6ttelser og skabeloner. Og selvf\u00f8lgelig kan alle indg\u00e5ende brugerdata nemt placeres i et objekt (Symfony\/HttpFoundation eller PSR-7). Frameworks er fantastiske!<\/p>\n<p>Men alt har sin pris. I ethvert enterprise-niveau framework kr\u00e6ves det, at du indl\u00e6ser mindst dusinvis af filer, opretter adskillige klasser og parser flere konfigurationer for at behandle en simpel brugerforesp\u00f8rgsel eller databaseanrop. Men det v\u00e6rste er, at efter hver opgave skal alt nulstilles, og du skal starte forfra: al den kode, du lige har initialiseret, bliver ubrugelig, og du kan ikke behandle endnu en anmodning med den. Fort\u00e6l dette til enhver programm\u00f8r, der skriver i et andet sprog, og du vil se forundring i deres ansigt.<\/p>\n<p>PHP-ingeni\u00f8rer har i \u00e5revis fors\u00f8gt at finde l\u00f8sninger p\u00e5 dette problem, anvendt velovervejede metoder til 'lazy' indl\u00e6sning, mikrorahmen, optimerede biblioteker, cache osv. Men i sidste ende er man stadig n\u00f8dt til at nulstille hele applikationen og starte forfra, gang p\u00e5 gang.<i> (Overs\u00e6tterens bem\u00e6rkning: denne problem bliver delvist l\u00f8st med fremkomsten af <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> i PHP 7.4)<\/p>\n<h3>Kan PHP overleve mere end \u00e9n anmodning ved hj\u00e6lp af Go?<\/h3>\n<p>\n<\/i>Man kan skrive PHP-scripts, der lever l\u00e6ngere end et par minutter (snarere timer eller dage): for eksempel cron-jobs, CSV-parsere, queue-browsere. Alle arbejder efter det samme m\u00f8nster: de henter en opgave, udf\u00f8rer den, venter p\u00e5 den n\u00e6ste. Koden er konstant i hukommelsen, hvilket sparer dyrebare millisekunder, da det tager tid at indl\u00e6se frameworket og applikationen ellers.<\/p>\n<p>Men det er ikke s\u00e5 let at udvikle langsigtede scripts. Enhver fejl dr\u00e6ber helt processen, diagnose af hukommelsesl\u00e6kager driver en til vanvid, og debugging med F5 kan ikke l\u00e6ngere bruges.<\/p>\n<p>Situationen er forbedret med udgivelsen af PHP 7: der er kommet en p\u00e5lidelig garbage collector, det er blevet lettere at h\u00e5ndtere fejl, og kernen udvidelser er nu beskyttet mod l\u00e6kager. Ingeni\u00f8rer skal stadig v\u00e6re forsigtige med hukommelsen og huske p\u00e5 tilstande i koden (er der et sprog, hvor man kan ignorere disse ting?). Men alligevel er der f\u00e6rre overraskelser i PHP 7.<\/p>\n<p>Kan man tage modellen for arbejde med langsigtede PHP-scripts, tilpasse den til mere trivielle opgaver som behandling af HTTP-anmodninger, og dermed undg\u00e5 at skulle indl\u00e6se alt fra bunden for hver anmodning?<\/p>\n<p>For at l\u00f8se denne opgave skulle man f\u00f8rst implementere en serverapplikation, der kunne modtage HTTP-anmodninger og videresende dem en ad gangen til PHP-arbejderen uden at dr\u00e6be det hver gang.<\/p>\n<p>Vi vidste, at vi kunne skrive en webserver i ren PHP (PHP-PM) eller med C-udvidelse (Swoole). Og selv om hver metode har sine fordele, var ingen af dem tilfredsstillende for os \u2014 vi \u00f8nskede noget mere. Vi havde brug for ikke bare en webserver \u2014 vi \u00f8nskede en l\u00f8sning, der kunne befri os fra de problemer, der er forbundet med \"tung opstart\" i PHP, og som samtidig kunne tilpasses og udvides til specifikke applikationer. Med andre ord havde vi brug for en applikationsserver.<\/p>\n<p>Kan Go hj\u00e6lpe med dette? Vi vidste, at det kunne, fordi dette sprog kompilerer applikationer til enkeltst\u00e5ende bin\u00e6re filer; det er tv\u00e6rplatformet; det bruger sin egen, meget elegante model for samtidighed (concurrency) og et bibliotek til at arbejde med HTTP; og endelig vil vi have adgang til tusinder af open-source-biblioteker og integrationer.<\/p>\n<h3>Udfordringer ved at kombinere to programmeringssprog<\/h3>\n<p>\nF\u00f8rst og fremmest skulle vi definere, hvordan to eller flere applikationer ville kommunikere med hinanden.<\/p>\n<p>For eksempel ved hj\u00e6lp af<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> et fremragende bibliotek<\/a><\/noindex> af Alex Palaeastris, der kunne implementere delt hukommelse mellem PHP og Go-processer (svarende til mod_php i Apache). Men dette bibliotek har nogle begr\u00e6nsninger, der begr\u00e6nser dets anvendelse til vores opgave.<\/p>\n<p>Vi besluttede at bruge en anden, mere udbredt tilgang: at opbygge interaktionen mellem processer via sockets\/pipe. Denne tilgang har i de seneste \u00e5rtier bevist sin p\u00e5lidelighed og er godt optimeret p\u00e5 systemniveau.<\/p>\n<p>F\u00f8rst oprettede vi et simpelt bin\u00e6rt protokol til dataudveksling mellem processer og fejlbehandling af overf\u00f8rsel. I sin enkleste form ligner protokollen denne type <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> med<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> med header af fast st\u00f8rrelse<\/a><\/noindex> (i vores tilf\u00e6lde 17 byte), der indeholder oplysninger om pakkeformat, dens st\u00f8rrelse og en bin\u00e6r maske til at kontrollere dataintegritet.<\/p>\n<p>P\u00e5 PHP-siden brugte vi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">funktionen pack<\/a><\/noindex>, og p\u00e5 Go-siden brugte vi biblioteket<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Vi syntes, at \u00e9t protokol var for lidt \u2014 s\u00e5 vi tilf\u00f8jede muligheden for at kalde<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> Go-tjenester net\/rpc direkte fra PHP<\/a><\/noindex>. Senere hjalp dette os meget under udviklingen, da vi nemt kunne integrere Go-biblioteker i PHP-applikationer. Resultatet af dette arbejde kan ses, for eksempel i et andet af vores open-source-produkter,<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Opdeling af opgaver mellem flere PHP-arbejdere<\/h3>\n<p>\nEfter implementeringen af interaktionsmekanismen begyndte vi at overveje, hvordan vi mest effektivt kunne overf\u00f8re opgaver til PHP-processerne. N\u00e5r en opgave kommer, skal applikationsserveren v\u00e6lge en ledig arbejder til at udf\u00f8re den. Hvis en arbejder\/proces stopper med en fejl eller \"d\u00f8r\", slipper vi af med den og opretter en ny i stedet. Og hvis en arbejder\/proces har udf\u00f8rt arbejdet succesfuldt, returnerer vi den til puljen af arbejdere, der er tilg\u00e6ngelige til at udf\u00f8re opgaver.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP er ikke skabt til at d\u00f8, eller Golang skynder sig til unds\u00e6tning\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTil opbevaring af puljen af aktive arbejdere brugte vi<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> en buffercanal<\/a><\/noindex>, for at fjerne uventet \"d\u00f8de\" arbejdere fra puljen tilf\u00f8jede vi en mekanisme til overv\u00e5gning af fejl og tilstande for arbejderne.<\/p>\n<p>Som resultat har vi f\u00e5et en fungerende PHP-server, der kan h\u00e5ndtere enhver foresp\u00f8rgsel pr\u00e6senteret i bin\u00e6r form.<\/p>\n<p>For at f\u00e5 vores applikation til at fungere som webserver, m\u00e5tte vi v\u00e6lge en p\u00e5lidelig PHP-standard til repr\u00e6sentation af enhver indkommende HTTP-foresp\u00f8rgsel. I vores tilf\u00e6lde <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">konverterer vi<\/a><\/noindex> net\/http-foresp\u00f8rgslen fra Go til formatet<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, s\u00e5 den er kompatibel med de fleste tilg\u00e6ngelige PHP-rammer i dag.<\/p>\n<p>Da PSR-7 betragtes som uforanderligt (nogen vil sige, at det teknisk set ikke er helt korrekt), m\u00e5 udviklerne skrive applikationer, der i princippet ikke behandler foresp\u00f8rgslen som en global enhed. Dette passer perfekt ind i konceptet med langlivede PHP-processer. Vores endelige implementering, som endnu ikke har f\u00e5et et navn, s\u00e5 s\u00e5ledes ud:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP er ikke skabt til at d\u00f8, eller Golang skynder sig til unds\u00e6tning\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Vi pr\u00e6senterer RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> en h\u00f8jtydende server til PHP-applikationer<\/a><\/noindex><\/h3>\n<p>\nVores f\u00f8rste testopgave var en API-backend, hvor uforudsigelige spikes i foresp\u00f8rgsler opstod periodisk (meget oftere end normalt). Selvom nginx i de fleste tilf\u00e6lde var tilstr\u00e6kkeligt, st\u00f8dte vi regelm\u00e6ssigt p\u00e5 fejl 502, fordi vi ikke kunne balancere systemet hurtigt nok til at im\u00f8dekomme det forventede stigning i belastningen.<\/p>\n<p>Til erstatning for denne l\u00f8sning implementerede vi i begyndelsen af 2018 vores f\u00f8rste PHP\/Go-applikationsserver. Og straks fik vi en utrolig effekt! Vi eliminerede ikke kun fejl 502 fuldst\u00e6ndigt, men vi form\u00e5ede ogs\u00e5 at reducere antallet af servere med to tredjedele, hvilket sparede en masse penge og hovedpinepiller til ingeni\u00f8rer og produktchefer.<\/p>\n<p>I midten af \u00e5ret forbedrede vi vores l\u00f8sning, offentliggjorde den p\u00e5 GitHub under MIT-licensen og kaldte den <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, hvilket understregede dens utrolige hastighed og effektivitet.<\/p>\n<h3>Hvordan RoadRunner kan forbedre din udviklingsstak<\/h3>\n<p>\nAnvendelse<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> gjorde det muligt for os at bruge Middleware net\/http p\u00e5 Go-siden for at udf\u00f8re JWT-verifikationer, inden anmodningen n\u00e5r PHP, samt for at behandle WebSockets og globalt aggregere tilstande i Prometheus. <\/p>\n<p>Med den indbyggede RPC kan man \u00e5bne API'er for enhver Go-bibliotek til PHP uden at skrive wrapper-extensions. Endnu vigtigere er det, at man med RoadRunner kan implementere nye servere, der adskiller sig fra HTTP. Eksempler inkluderer lancering af PHP-handlere<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, oprettelse af p\u00e5lidelige k\u00f8-parsers og endda tilf\u00f8jelse<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> til vores applikationer.<\/p>\n<p>Ved hj\u00e6lp af PHP- og Go-samfundene har vi \u00f8get stabiliteten i l\u00f8sningen og i nogle tests \u00f8get applikationernes ydeevne med op til 40 gange, forbedret debuggingsv\u00e6rkt\u00f8jer, implementeret integration med Symfony-rammen og tilf\u00f8jet st\u00f8tte til HTTPS, HTTP\/2, plugins og PSR-17.<\/p>\n<h3>Konklusion<\/h3>\n<p>\nNogle sidder stadig fast i det for\u00e6ldede syn p\u00e5 PHP som et langsomt og klodset sprog, der kun er egnet til at skrive plugins til WordPress. Disse mennesker kan endda sige, at PHP har en s\u00e5dan begr\u00e6nsning: n\u00e5r en applikation bliver stor nok, skal man v\u00e6lge et mere 'modent' sprog og omskrive den opbyggede kodebase, som har v\u00e6ret samlet i mange \u00e5r.<\/p>\n<p>Alt dette vil vi sige: t\u00e6nk igen. Vi mener, at det kun er dig selv, der s\u00e6tter nogle begr\u00e6nsninger for PHP. Du kan bruge hele dit liv p\u00e5 at skifte fra det ene sprog til det andet, i et fors\u00f8g p\u00e5 at finde den perfekte l\u00f8sning til dine behov, eller du kan begynde at betragte sprog som v\u00e6rkt\u00f8jer. De indbildte mangler ved sprog som PHP kan faktisk v\u00e6re grunden til dets succes. Og hvis du kombinerer det med et andet sprog som Go, kan du skabe langt mere magtfulde produkter, end hvis du kun brugte \u00e9t sprog.<\/p>\n<p>Efter at have arbejdet med kombinationen af Go og PHP, kan vi bekr\u00e6fte, at vi elsker dem. Vi planl\u00e6gger ikke at ofre det ene for det andet \u2014 tv\u00e6rtimod vil vi lede efter m\u00e5der at f\u00e5 endnu mere gavn af denne dobbelte stak.<\/p>\n<p><i>UPD: vi byder velkommen til skaberen af RoadRunner og medforfatteren af den oprindelige artikel \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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 er ikke skabt til at d\u00f8, eller Golang kommer hurtigt til unds\u00e6tning | ProHoster","description":"Hello, Habr!","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}