{"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\/et\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP ei ole loodud surema, v\u00f5i Golang pr\u00f5ksib appi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP ei ole loodud surema, v\u00f5i Golang pr\u00f5ksib appi\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTere, Habr! Me Badoo-s t\u00f6\u00f6tame aktiivselt <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">PHP j\u00f5udluse kallal<\/a><\/noindex>, kuna meil on piisavalt suur s\u00fcsteem sellel keelel ja j\u00f5udluse k\u00fcsimus on rahak\u00fcsimus. \u00dcle k\u00fcmne aasta tagasi l\u00f5ime selle jaoks PHP-FPM, mis algselt oli PHP jaoks pat\u0161ide kogum ja hiljem sai ametlikuks osaks.<\/p>\n<p>Viimastel aastatel on PHP oluliselt edasi arenenud: pr\u00fcgikorjaja on paranenud, stabiilsus on kasvanud - t\u00e4na on PHP-s v\u00f5imalik probleemideta kirjutada deemonid ja pikaealisi skripte. See v\u00f5imaldas Spiral Scoutil minna kaugemale: RoadRunner ei puhasta, erinevalt PHP-FPM-ist, m\u00e4lu p\u00e4ringute vahel, mis annab lisav\u00f5idu j\u00f5udluses (kuigi see l\u00e4henemine muudab arendamise protsessi keerulisemaks). Praegu katsetame seda t\u00f6\u00f6riista, kuid meil pole veel tulemusi, millega jagada. Et oodata oleks l\u00f5busam, <b>publitseerime Spiral Scouti RoadRunneri teadet t\u00f5lke.<\/b><\/p>\n<p>Artiklis esitatud l\u00e4henemine on meile tuttav: oma probleemide lahendamisel kasutame ka enamasti PHP ja Go kombinatsiooni, saades kasu m\u00f5lema keele eeliste kasutamisest ja loobumata \u00fchest teise kasuks.<\/p>\n<p>Naudi!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Viimase k\u00fcmne aasta jooksul oleme loonud rakendusi nii ettev\u00f5tetele, kes kuuluvad nimekirja <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, kui ka \u00e4ridele, millel on maksimaalselt 500 kasutajat. Kogu selle aja jooksul on meie insenerid arendanud peamiselt PHP-l baseeruvat tausts\u00fcsteemi. Ent kaks aastat tagasi m\u00f5jutas \u00fcks asi p\u00f5hjalikult mitte ainult meie toodete sooritust, vaid ka nende skaleeritavust \u2014 lisasime oma tehnoloogiahunnikusse Golangi (Go).<\/p>\n<p>Peaaegu kohe avastasime, et Go v\u00f5imaldab meil luua suuremaid rakendusi, saavutades kuni 40-kordse tootlikkuse kasvu. Selle abil suutsime laiendada olemasolevaid PHP-s kirjutatud tooteid, parandades neid, kasutades kahe keele eeliste kombinatsiooni.<\/p>\n<p>R\u00e4\u00e4gime, kuidas Go ja PHP kombinatsioon aitab lahendada reaalmaailma arendusprobleeme ning kuidas see on muutunud meie jaoks t\u00f6\u00f6riistaks, mis suudab lahendada osa probleemidest, millega seostatakse <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">PHP 'suremise' mudelit<\/a><\/noindex>.<\/p>\n<h3>Teie igap\u00e4evane PHP arenduskeskkond<\/h3>\n<p>\nEnne kui r\u00e4\u00e4gime, kuidas Go abil PHP 'suremise' mudelit ellu \u00e4ratada, vaatame teie tavalist PHP arenduskeskkonda.<\/p>\n<p>Enamikul juhtudel k\u00e4itate rakendust koos veebiserveri nginx ja PHP-FPM serveriga. Esimene teenindab staatilisi faile ja suunab PHP-FPM-i spetsiifilised p\u00e4ringud, samas kui PHP-FPM t\u00e4idab PHP-koodi. V\u00f5ib-olla kasutate v\u00e4hem populaarset kombinatsiooni Apache ja mod_php. Kuid kuigi selle toimimine on veidi erinev, on p\u00f5him\u00f5tted samad.<\/p>\n<p>Uurime, kuidas PHP-FPM rakenduskoodi t\u00e4idab. Kui p\u00e4ring saabub, alustab PHP-FPM alams\u00fcsteemi PHP-protsessi ning edastab p\u00e4ringu \u00fcksikasjad osana selle olekust (_GET, _POST, _SERVER jne). <\/p>\n<p>Olek ei saa PHP-skripti t\u00e4itmise ajal muutuda, seega saab uue sisendi ainult \u00fche viisiga: protsessi m\u00e4lu puhastades ja selle uuesti initsialiseerides.<\/p>\n<p>Sellise t\u00e4itmismudelil on palju eeliseid. Te ei pea muretsema m\u00e4lutarbimise p\u00e4rast, k\u00f5ik protsessid on t\u00e4ielikult isoleeritud ja kui \u00fcks neist 'sureb', siis luuakse see automaatselt uuesti ning see ei m\u00f5juta teisi protsesse. Kuid sellel l\u00e4henemisel on ka puudusi, mis ilmnevad rakenduse skaleerimise katsetel.<\/p>\n<h3>Tavalise PHP-keskkonna puudused ja t\u00f5hususe puudumine<\/h3>\n<p>\nKui te tegelete professionaalse PHP arendamisega, siis teate, et uue projekti alustamine algab raamistikku valimisest. See koosneb teekidest s\u00f5ltuvuste s\u00fcstimiseks, ORM-idest, t\u00f5lgetest ja mallidest. Muidugi saab k\u00f5ik sisendid mugavalt paigutada \u00fche objekti sisse (Symfony\/HttpFoundation v\u00f5i PSR-7). Raamistiku kasutamine on \u00e4ge!<\/p>\n<p>Kuid k\u00f5igel on oma hind. Igasse ettev\u00f5tte taseme raamistikku lihtsa kasutaja p\u00e4ringu v\u00f5i andmebaasi p\u00e4ringu t\u00f6\u00f6tlemiseks tuleb laadida v\u00e4hemalt k\u00fcmneid faile, luua mitmeid klasse ja anal\u00fc\u00fcsida mitmeid konfiguratsioone. Veelgi halvem on see, et iga \u00fclesande t\u00e4itmise j\u00e4rel tuleb k\u00f5ik taastada ja alustada nullist: kogu just k\u00e4ivitatud kood muutub kasutuks, te ei saa sellega enam \u00fchtki p\u00e4ringut t\u00f6\u00f6delda. R\u00e4\u00e4kige sellest igale programmeerijale, kes kirjutab m\u00f5nes teises keeles, ja n\u00e4ete h\u00e4mmeldust tema n\u00e4ol.<\/p>\n<p>PHP-arendajad on aastaid otsinud viise selle probleemi lahendamiseks, kasutades hoolikalt v\u00e4lja t\u00f6\u00f6tatud \u201elaiskade\u201d laadimise meetodeid, mikroraamistikke, optimeeritud raamatukogusid, vahem\u00e4lu jne. L\u00f5puks peab aga ikkagi kogu rakenduse nullima ja alustama uuesti, ja uuesti.<i> (T\u00f5lkija m\u00e4rkus: osaliselt lahendab seda probleemi <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> PHP 7.4 tulek)<\/p>\n<h3>Kas PHP suudab Go abil taluda rohkem kui \u00fchte p\u00e4ringut?<\/h3>\n<p>\n<\/i>On v\u00f5imalik kirjutada PHP-skripte, mis kestavad kauem kui paar minutit (kuni tundide v\u00f5i p\u00e4evadeni): n\u00e4iteks cron-\u00fclesanded, CSV-parsirid, j\u00e4rjekorraanal\u00fcsaatorid. K\u00f5ik need t\u00f6\u00f6tavad \u00fches stsenaariumis: nad v\u00f5tavad \u00fclesande, t\u00e4idavad selle, ootavad j\u00e4rgmist. Kood on pidevalt m\u00e4lus, s\u00e4\u00e4stes hinnalisi millisekundeid, kuna raamistikku ja rakendust laadides tuleb teha mitmeid t\u00e4iendavaid toiminguid.<\/p>\n<p>Kuid pikaajaliste skriptide arendamine ei ole nii lihtne. Iga viga tapab protsessi t\u00e4ielikult, m\u00e4lulekete t\u00f5rkeotsing ajab hulluks ja F5 abil silumise kasutamine ei ole enam v\u00f5imalik.<\/p>\n<p>PHP 7 v\u00e4ljumisega on olukord paranenud: ilmus usaldusv\u00e4\u00e4rne pr\u00fcgikorjaja, vigade t\u00f6\u00f6tlemine on lihtsam ja tuumapikendused on n\u00fc\u00fcd lekete eest kaitstud. Siiski peavad insenerid endiselt olema ettevaatlikud m\u00e4luga ja meeles pidama koodi seisundi probleeme (kas on olemas keel, kus nendele asjadele ei pea t\u00e4helepanu p\u00f6\u00f6rama?). Siiski on PHP 7-s meid v\u00e4hem \u00fcllatusi ootamas.<\/p>\n<p>Kas on v\u00f5imalik v\u00f5tta pikaajaliste PHP-skriptide t\u00f6\u00f6mudel, kohandada seda lihtsate HTTP-p\u00e4ringute t\u00f6\u00f6tlemiseks ja seel\u00e4bi vabaneda vajadusest iga p\u00e4ringu puhul k\u00f5ik uuesti laadida?<\/p>\n<p>Selle \u00fclesande lahendamiseks oli esmalt vaja rakendada serveri rakendus, mis suudaks vastu v\u00f5tta HTTP-p\u00e4ringuid ja suunata need j\u00e4rjestikku PHP-t\u00f6\u00f6rakendusele, tappa seda igal korral mitte.<\/p>\n<p>Me teadsime, et suudame kirjutada veebiserveri puhta PHP (PHP-PM) v\u00f5i C-laienduse (Swoole) abil. Kuigi m\u00f5lemal meetodil on oma eelised, ei rahuldanud need meid \u2013 otsisime midagi enamat. Me vajasime mitte lihtsalt veebiserverit, vaid lahendust, mis suudaks meid vabastada PHP \u201eraske k\u00e4ivitamise\u201d probleemidest ja mille saaks h\u00f5lpsasti kohandada ja laiendada konkreetsete rakenduste jaoks. See t\u00e4hendab, et vajasime rakendusserverit.<\/p>\n<p>Kas Go saab meid aidata? Me teadisime, et saab, sest see keel kompileerib rakendused \u00fcksikutesse binaarfailidesse; see on platvormide\u00fclene; kasutab oma v\u00e4ga elegantset, paralleelse t\u00f6\u00f6tlemise (concurrency) mudelit ja HTTP-t\u00f6\u00f6tlusraamatukogusid; ja l\u00f5puks on meil ligip\u00e4\u00e4s tuhandetele avatud l\u00e4htekoodiga raamatukogudele ja integratsioonidele.<\/p>\n<h3>Kaks programmeerimiskeelt \u00fchendamise raskused<\/h3>\n<p>\nEsiteks pidi m\u00e4\u00e4rama, kuidas kaks v\u00f5i enam rakendust omavahel suhtlevad.<\/p>\n<p>N\u00e4iteks kauni raamatukogu kaudu<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> ilusa raamatukoguga<\/a><\/noindex> Aleksa Palaestrasa v\u00f5imaldas PHP ja Go protsesside vahel jagada m\u00e4lu (sarnaselt mod_php-ga Apache'is). Kuid sellel teegil on omad erip\u00e4rad, mis piiravad selle rakendamist meie \u00fclesande lahendamiseks.<\/p>\n<p>Otsustasime kasutada teistsugust, laialdasemalt levinud l\u00e4henemist: ehitada protsesside vaheline suhtlus socket'ite\/p\u00f5hjal. See l\u00e4henemine on viimase paarik\u00fcmne aasta jooksul t\u00f5estanud oma usaldusv\u00e4\u00e4rsust ning on operatsioonis\u00fcsteemi tasandil h\u00e4sti optimeeritud.<\/p>\n<p>Alguses loodi lihtne binaarprotokoll andmete vahetamiseks protsesside vahel ja edastuse t\u00f5rke k\u00e4sitlemiseks. Selle lihtsaimas vormis on selline protokoll sarnane <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> koos<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> fikseeritud suurusega p\u00e4isega<\/a><\/noindex> (meie juhul 17 baiti), mis sisaldab teavet paketi t\u00fc\u00fcbi, suuruse ja andmete terviklikkuse kontrollimiseks m\u00f5eldud binaarsemaskide kohta.<\/p>\n<p>PHP poolel kasutasime <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">funktsiooni pack<\/a><\/noindex>, ning Go poolel - raamatukogu<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>\u00dcks protokoll ei olnud piisav - ja lisasime v\u00f5imaluse kutsuda<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> Go teenuseid net\/rpc otse PHP-st<\/a><\/noindex>. Hiljem aitas see meid arenduses v\u00e4ga, kuna saime h\u00f5lpsasti integreerida Go teeke PHP rakendustesse. Selle t\u00f6\u00f6 tulemust saab n\u00e4ha n\u00e4iteks meie teises open-source tootmis.<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>\u00dclesannete jaotamine mitmete PHP t\u00f6\u00f6tajate vahel<\/h3>\n<p>\nP\u00e4rast suhtlemismehhanismi rakendamist hakkasime m\u00f5tlema, kuidas k\u00f5ige t\u00f5husamalt edastada \u00fclesandeid PHP protsessidele. Kui \u00fclesanne saabub, peab rakendusserver valima selle t\u00e4itmiseks vaba t\u00f6\u00f6taja. Kui t\u00f6\u00f6taja\/protsess l\u00f5petab t\u00f6\u00f6 vea t\u00f5ttu v\u00f5i \u00absureb\u00bb, then eemaldame selle ja loome asemele uue. Kui t\u00f6\u00f6taja\/protsess t\u00f6\u00f6tab edukalt, tagastame selle \u00fclesannete t\u00e4itmiseks kergesti k\u00e4tte saadavate t\u00f6\u00f6tajate hulka.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ei ole loodud surema, v\u00f5i Golang pr\u00f5ksib appi\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAktiveeritud t\u00f6\u00f6tajate kihi salvestamiseks kasutasime<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> buffeeritud kanali<\/a><\/noindex>, et ootamatult \u00absurnud\u00bb t\u00f6\u00f6tajad eemaldada, lisasime t\u00f6\u00f6tajate vigade ja seisundite j\u00e4lgimise mehhanismi.<\/p>\n<p>Tulemuseks saime t\u00f6\u00f6tava PHP serveri, mis suudab k\u00e4sitleda k\u00f5iki binaarses vormingus esitatud p\u00e4ringuid.<\/p>\n<p>Kuna meie rakendus peab t\u00f6\u00f6tama veebiserverina, pidime valima usaldusv\u00e4\u00e4rse PHP-standardi, et esindada k\u00f5iki sissetulevaid HTTP-p\u00e4ringuid. Meie puhul me lihtsalt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">muudame<\/a><\/noindex> net\/http-p\u00e4ringu Go-s formaati<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, et see oleks \u00fchilduv enamikuga t\u00e4nap\u00e4eval saadaval olevatest PHP-raamistikkudest.<\/p>\n<p>Kuna PSR-7 on muudetav (m\u00f5ned \u00fctlevad, et tehniliselt see nii ei ole), peavad arendajad kirjutama rakendusi, mis ei k\u00e4sitle p\u00e4ringut globaalse olendina. See sobib suurep\u00e4raselt p\u00fcsivate PHP-protsesside kontseptsiooniga. Meie l\u00f5plik teostus, millele pole veel nime antud, n\u00e4gi v\u00e4lja selline:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP ei ole loodud surema, v\u00f5i Golang pr\u00f5ksib appi\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Tutvustame RoadRunnerit \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> k\u00f5rge j\u00f5udlusega PHP-rakenduste server<\/a><\/noindex><\/h3>\n<p>\nMeie esimene test\u00fclesanne oli API tagaplaan, millel esines perioodiliselt ettearvamatu p\u00e4ringute h\u00fcppeid (kordades sagedamini kui tavaliselt). Kuigi enamikul juhtudel piisab nginx-i v\u00f5imekusest, seisame pidevalt silmitsi 502. vea, kuna ei suutnud s\u00fcsteemi piisavalt kiiresti tasakaalustada oodatava koormuse suurenemise t\u00f5ttu.<\/p>\n<p>2018. aasta alguses asendasime selle lahenduse, kasutades esmakordselt meie PHP\/Go rakenduste serverit. Tulemused olid h\u00e4mmastavad! Saime mitte ainult 502 t\u00f5rkest lahti, vaid v\u00e4hendasime ka teenuste arvu kahel kolmandikul, s\u00e4\u00e4stes sellega palju raha ja v\u00e4hendades inseneride ja tootejuhtide peavalusid.<\/p>\n<p>Aasta keskpaiku t\u00e4iustasime meie lahendust, avaldasime selle GitHub'is MIT litsentsi alusel ja kutsusime seda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, r\u00f5hutades selle uskumatut kiirus ja efektiivsust.<\/p>\n<h3>Kuidas RoadRunner v\u00f5ib teie arenduslaari parandada<\/h3>\n<p>\nKasutamine<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> sai meie v\u00f5imaluseks kasutada Middleware net\/http Go poolel, et teostada JWT-verify enne, kui p\u00e4ring j\u00f5uab PHP'ni, samuti WebSocketide t\u00f6\u00f6tlemiseks ja globaalseteks olekute kogumiseks Prometheuses. <\/p>\n<p>Sisseehitatud RPC abil on v\u00f5imalik avada API igasuguste Go raamatukogude jaoks PHP's ilma wrapper-ekstensioonide kirjutamiseta. Veelgi olulisem on see, et RoadRunner'i abil on v\u00f5imalik juurutada uusi servereid, mis erinevad HTTP-st. N\u00e4iteks on v\u00f5imalik k\u00e4ivitada PHP t\u00f6\u00f6tlajaid<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, luua usaldusv\u00e4\u00e4rseid j\u00e4rjekorra parsereid ja isegi lisada<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> meie rakendustesse.<\/p>\n<p>PHP ja Go kogukondade toel oleme parandanud lahenduse stabiilsust, suurendanud testides rakenduste j\u00f5udlust kuni 40 korda, t\u00e4iustanud t\u00f5rkeotsingu t\u00f6\u00f6riistu, rakendanud integratsiooni Symfony raamistikuga ning lisanud toe HTTPS, HTTP\/2, pistikprogrammidele ja PSR-17-le.<\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\nM\u00f5ned inimesed on endiselt kinni vananenud arusaamades PHP-st kui aeglasest ja mahukast keelest, mida kasutatakse ainult WordPressi pistikpluginate kirjutamiseks. Need inimesed v\u00f5ivad isegi v\u00e4ita, et PHP-l on selline piirang: kui rakendus muutub piisavalt suureks, tuleb valida \u201ek\u00fcpsem\u201c keel ja \u00fcmber kirjutada aastate jooksul kogunenud koodibaas.<\/p>\n<p>K\u00f5igele sellele tahaks vastata: m\u00f5elge veel kord. Me usume, et ainult teie ise seate PHP-le mingid piirangud. V\u00f5ite veeta kogu oma elu \u00fchel keelelt teisele siirdumisel, p\u00fc\u00fcdes leida teie vajadustega ideaalset kombinatsiooni, v\u00f5i v\u00f5ite hakata keeli k\u00e4sitlema kui t\u00f6\u00f6riistu. PHP keele v\u00e4idetavad puudused v\u00f5ivad tegelikult olla selle edu p\u00f5hjuseks. Ja kui kombineerida see m\u00f5ne teise keelega, nagu Go, siis loote palju v\u00f5imsamaid tooteid, kui kui piirdute ainult \u00fche keele kasutamisega.<\/p>\n<p>T\u00f6\u00f6tanud Go ja PHP kombinatsiooniga, saame kinnitada, et oleme neist armunud. Me ei plaani \u00fchte teise arvelt ohverdada \u2014 vastupidi, otsime viise, kuidas veelgi rohkem kasu saada sellest kahekordsest tehnoloogiast.<\/p>\n<p><i>UPD: tervitame RoadRunneri loojat ja originaalartikli kaasautorit \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Allikas: <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.0.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\/et\/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.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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 ei ole loodud, et surema, v\u00f5i Golang tunneb kiusatust appi tulla | ProHoster","description":"Tere, Habr!","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}