{"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 pole loodud surema, v\u00f5i Golang kiirustab appi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP pole loodud surema, v\u00f5i Golang kiirustab 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 sellel keelel piisavalt suur s\u00fcsteem ja j\u00f5udluse k\u00fcsimus on rahak\u00fcsimus. \u00dcle k\u00fcmne aasta tagasi l\u00f5ime selleks PHP-FPM-i, mis algselt oli PHP jaoks m\u00f5eldud plaastrite kogum ja hiljem sai ametlikku v\u00e4ljastusse.<\/p>\n<p>Viimastel aastatel on PHP palju edenenud: pr\u00fcgikoristus on paranenud, stabiilsus on kasvanud - t\u00e4na saab PHP-s ilma suuremate probleemideta kirjutada deemonite ja pikaajalisi skripte. See v\u00f5imaldas Spiral Scoutil edasi liikuda: RoadRunner, erinevalt PHP-FPM-ist, ei puhasta m\u00e4lu p\u00e4ringute vahel, mis annab lisah\u00fcve j\u00f5udluses (kuigi see l\u00e4henemine muudab arendusprotsessi keerulisemaks). Me katsetame praegu seda t\u00f6\u00f6riista, kuid me ei ole veel tulemusi, mida jagada. Ootamise l\u00f5busamaks muutmiseks, <b>avalikustame Spiral Scouti RoadRunneri esitlusest t\u00f5lgitud versiooni.<\/b><\/p>\n<p>Artiklis esitatud l\u00e4henemine on meile l\u00e4hedane: oma probleemide lahendamisel kasutame me samuti enamasti PHP ja Go kombinatsiooni, saavutades kasu m\u00f5lemast keelest, 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 Fortune 500 nimekirjas olevatele ettev\u00f5tetele <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, kui ka ettev\u00f5tetele, mille auditoorium ei \u00fcleta 500 kasutajat. Kogu selle aja on meie insenerid toetanud peamiselt PHP taustapinda. Kuid kaks aastat tagasi m\u00f5jutas miski m\u00e4rkimisv\u00e4\u00e4rselt mitte ainult meie toodete j\u00f5udlust, vaid ka nende skaleeritavust - tutvustasime Golangi (Go) meie tehnoloogilisse virna.<\/p>\n<p>Peaaegu kohe avastasime, et Go v\u00f5imaldab meil luua suuremaid rakendusi, suurendades j\u00f5udlust kuni 40 korda. Selle abil saime laiendada olemasolevaid PHP-s kirjutatud tooteid, parandades neid, kasutades m\u00f5lema keele eeliseid.<\/p>\n<p>Me r\u00e4\u00e4gime sellest, kuidas Go ja PHP kombinatsioon aitab lahendada tegelikke arenduse v\u00e4ljakutseid ja kuidas sellest on saanud meie t\u00f6\u00f6riist, mis suudab v\u00e4hendada PHP-ga seotud probleeme, mis on seotud <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">PHP 'suretamise' mudeliga<\/a><\/noindex>.<\/p>\n<h3>Teie igap\u00e4evane PHP arenduskeskkond<\/h3>\n<p>\nEnne kui r\u00e4\u00e4gime, kuidas Go abil on v\u00f5imalik elustada PHP 'suretamise' mudelit, vaatame teie standardset PHP arenduskeskkonda.<\/p>\n<p>Enamikul juhtudel k\u00e4ivitate rakenduse koos veebiserveri nginx ja PHP-FPM serveriga. Esimene teenindab staatilisi faile ja suunab PHP-FPM-ile spetsiifilisi p\u00e4ringuid, samas kui PHP-FPM k\u00e4ivitab PHP-koodi. V\u00f5ib-olla kasutate v\u00e4hem populaarset kombinatsiooni Apache'ist ja mod_php'ist. Kuigi see t\u00f6\u00f6tab veidi teisiti, on p\u00f5him\u00f5tted samad.<\/p>\n<p>Vaadakem, kuidas PHP-FPM rakenduse koodi k\u00e4ivitab. Kui saabub p\u00e4ring, k\u00e4ivitab PHP-FPM alams\u00fcsteemi PHP-protsessi ja edastab p\u00e4ringu detailid osana selle olekust (_GET, _POST, _SERVER jne). <\/p>\n<p>Olek ei saa PHP-skripti t\u00e4itmise ajal muutuda, seega on uue sisendkomplekti saamiseks ainult \u00fcks v\u00f5imalus: puhastada protsessi m\u00e4lu ja algatada see uuesti.<\/p>\n<p>Selle t\u00e4itmismudeli puhul on palju eeliseid. Te ei pea v\u00e4ga muretsema m\u00e4lu tarbimise p\u00e4rast, k\u00f5ik protsessid on t\u00e4ielikult isoleeritud ja kui m\u00f5ni neist 'sureb', siis loob see automaatselt uue ning see ei m\u00f5juta teisi protsesse. Kuid sellel l\u00e4henemisel on ka puudusi, mis ilmnevad rakenduse skaleerimisel.<\/p>\n<h3>Tavap\u00e4rase PHP-keskkonna puudused ja ebaefektiivsus<\/h3>\n<p>\nKui tegelete professionaalse PHP-arendusega, siis teate, et uue projekti alustamiseks tuleb alustada raamistiku valimisega. See on teegikomplekt s\u00f5ltuvuste sisestamiseks, ORM-id, t\u00f5lked ja templandid. Ja muidugi v\u00f5ib k\u00f5ik kasutaja sisendandmed mugavalt panna \u00fchte objekti (Symfony\/HttpFoundation v\u00f5i PSR-7). Raamistike kasutamine on \u00e4ge!<\/p>\n<p>Kuid k\u00f5igel on hind. Igap\u00e4evases ettev\u00f5tte taseme raamistikus peab lihtsa kasutaja p\u00e4ringu v\u00f5i andmebaasi p\u00e4ringu t\u00f6\u00f6tlemiseks laadima v\u00e4hemalt tosin failidest, looma arvukalt klasse ja parsima mitmeid konfiguratsioone. Kuid k\u00f5ige hullem on see, et p\u00e4rast iga \u00fclesande t\u00e4itmist tuleb k\u00f5ik nullida ja alustada uuesti: kogu just algatatud kood muutub v\u00e4\u00e4rtusetuks, te ei saa selle abil enam \u00fchegi teise p\u00e4ringut t\u00f6\u00f6delda. R\u00e4\u00e4kige sellest \u00fcksk\u00f5ik kellele, kes kodeerib m\u00f5nes teises keeles, ja te n\u00e4ete tema n\u00e4os arusaamatust.<\/p>\n<p>PHP-insenerid on aastaid otsinud viise selle probleemi lahendamiseks, kasutanud nutikaid 'laiskade' laadimise meetodeid, mikromooduleid, optimeeritud raamatukogusid, vahem\u00e4lu jne. Kuid l\u00f5puks tuleb ikkagi kogu rakendus tagasi nullida ja uuesti alustada, ikka ja j\u00e4lle.<i> (T\u00f5lkija m\u00e4rkuse: osaliselt lahendab see probleem <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> PHP 7.4)<\/p>\n<h3>Kas PHP suudab Go abil vastu pidada rohkem kui \u00fchele p\u00e4ringule?<\/h3>\n<p>\n<\/i>V\u00f5ib kirjutada PHP skripte, mis elavad kauem kui m\u00f5ned minutid (kuni tundide v\u00f5i p\u00e4evadeni): n\u00e4iteks cron-\u00fclesanded, CSV-parserid, j\u00e4rjekorra t\u00f6\u00f6tlejad. K\u00f5ik need toimivad \u00fchesuguse stsenaariumi alusel: nad toovad \u00fclesande, t\u00e4idavad selle, ootavad j\u00e4rgmist. Kood on pidevalt m\u00e4lus, s\u00e4\u00e4stes v\u00e4\u00e4rtuslikke millisekunde, kuna raamistiku ja rakenduse laadimiseks on vajalik teostada mitmeid lisa\u00fclesandeid.<\/p>\n<p>Kuid pikaajaliste skriptide arendamine pole nii lihtne. Iga viga tapab protsessi t\u00e4ielikult, m\u00e4lulekke diagnoosimine ajab vihale ja F5-debugimise kasutamine pole enam v\u00f5imalik.<\/p>\n<p>Olek on paranenud koos PHP 7 ilmumisega: ilmus usaldusv\u00e4\u00e4rne pr\u00fcgikogumise s\u00fcsteem, vigade t\u00f6\u00f6tlemine on lihtsam ja tuumalaienemised on n\u00fc\u00fcd lekkete eest kaitstud. T\u00f5si, inseneridel tuleb endiselt ettevaatlikult m\u00e4lu k\u00e4sitleda ja meeles pidada koodiseisundi probleeme (kas on olemas keel, kus nendele asjadele t\u00e4helepanu ei p\u00f6\u00f6rata?). Siiski on PHP 7-s meid v\u00e4hem ootamatustega.<\/p>\n<p>Kas on v\u00f5imalik v\u00f5tta pikaajaliste PHP-skriptide t\u00f6\u00f6mudel, kohandada see lihtsate \u00fclesannete, n\u00e4iteks HTTP-p\u00e4ringute t\u00f6\u00f6tlemise jaoks ja seel\u00e4bi vabaneda vajadusest iga p\u00e4ringu puhul k\u00f5ik uuesti laadida?<\/p>\n<p>Selle probleemi lahendamiseks pidi esmalt rakendama serverirakendust, mis suudab vastu v\u00f5tta HTTP-p\u00e4ringuid ja suunata need \u00fcksteise j\u00e4rel PHP-t\u00f6\u00f6tlejale, tapmata seda iga kord.<\/p>\n<p>Me teadsime, et suudame kirjutada veebiserveri puhta PHP (PHP-PM) v\u00f5i C-lisandiga (Swoole). Kuigi kummalgi meetodil on omad eelised, ei rahuldanud m\u00f5lemad variandid meid \u2014 soovisime midagi enamat. Vajasime mitte lihtsalt veebiserverit \u2014 meie eesm\u00e4rk oli leida lahendus, mis vabastaks meid PHP \u201eraskest k\u00e4ivitamisest\u201c ja oleks samas kergesti kohandatav ja laiendatav konkreetsete rakenduste jaoks. Seega oli meil vajalik rakenduste server.<\/p>\n<p>Kas Go v\u00f5ib selles aidata? Me teadsime, et v\u00f5ib, sest see keel kompileerib rakendused \u00fchtsetesse binaarfailidesse; see on platvormidevaheline; kasutab oma v\u00e4ga elegantset, paralleelse t\u00f6\u00f6tlemise mudelit ja HTTP t\u00f6\u00f6tluse raamatukogu; ning l\u00f5puks, meil on juurdep\u00e4\u00e4s tuhandetele avatud l\u00e4htekoodiga raamatukogudele ja integratsioonidele.<\/p>\n<h3>Kahe programmeerimiskeele \u00fchendamise raskused<\/h3>\n<p>\nEsimene samm oli m\u00e4\u00e4rata, kuidas kaks v\u00f5i enam rakendust omavahel suhtlevad.<\/p>\n<p>N\u00e4iteks, kasutades<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> suurep\u00e4rast raamatukogu<\/a><\/noindex> Alex Pal\u00e4stra, oli v\u00f5imalik rakendada PHP ja Go protsesside vahel m\u00e4lu jagamist (sarnaselt mod_php-ga Apache's). Kuid sellel raamatukogul on omadused, mis piiravad selle rakenduse sobivust meie \u00fclesande lahendamiseks.<\/p>\n<p>Otsustasime kasutada teist, laialdasemalt levinud l\u00e4henemist: ehitada interaktsioon protsesside vahel l\u00e4bi socket'ite\/torude. See l\u00e4henemine on viimase paarik\u00fcmne aasta jooksul t\u00f5estanud oma usaldusv\u00e4\u00e4rsust ja on h\u00e4sti optimeeritud operatsioonis\u00fcsteemi tasemel.<\/p>\n<p>Alustuseks l\u00f5ime lihtsa binaarprotokolli andmevahetuseks protsesside vahel ja edastamise vigade t\u00f6\u00f6tlemiseks. Oma k\u00f5ige lihtsamas vormis sarnaneb selline protokoll <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> jot<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> fikseeritud suurusega paketi p\u00e4isega<\/a><\/noindex> (meie puhul 17 baiti), mis sisaldab teavet paketi t\u00fc\u00fcbi, selle suuruse ja andmete terviklikkuse kontrollimiseks m\u00f5eldud binaarset maski.<\/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>, samas kui Go poolel kasutasime 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 tundunud piisav \u2014 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, kuna saime h\u00f5lpsasti integreerida Go-raamatukogusid PHP-rakendustesse. Selle t\u00f6\u00f6 tulemust v\u00f5ib n\u00e4ha n\u00e4iteks meie teises avatud l\u00e4htekoodiga tootes<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>\u00dclesannete jaotamine mitme PHP-t\u00f6\u00f6taja vahel<\/h3>\n<p>\nP\u00e4rast suhtlemismehhanismi rakendamist hakkasime m\u00f5tlema, kuidas edastada PHP-protsessidele \u00fclesandeid v\u00f5imalikult efektiivselt. Kui \u00fclesanne saabub, peab rakenduse server valima t\u00f6\u00f6taja, kes selle t\u00e4itmise jaoks vaba on. Kui t\u00f6\u00f6taja\/protsess l\u00f5petas t\u00f6\u00f6 veaga v\u00f5i \u201esuri\u201c, vabaneme temast ja loome uue asemele. Kui t\u00f6\u00f6taja\/protsess t\u00f6\u00f6tas edukalt, saadame ta tagasi t\u00f6\u00f6tajate rikka, kes on valmis \u00fclesandeid t\u00e4itma.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP pole loodud surema, v\u00f5i Golang kiirustab appi\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAktiivsete t\u00f6\u00f6tajate kogu salvestamiseks kasutasime<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> puhverdatud kanalit<\/a><\/noindex>, t\u00f6\u00f6tajate ootamatult \u201esuretud\u201d eemaldamiseks lisasime veahaldus- ja olekute j\u00e4lgimise mehhanismi.<\/p>\n<p>Tulemuseks saime t\u00f6\u00f6tava PHP-serveri, mis suudab t\u00f6\u00f6delda igasuguseid binaarseid p\u00e4ringuid.<\/p>\n<p>Et meie rakendus saaks t\u00f6\u00f6tada nagu veebiserver, pidime valima usaldusv\u00e4\u00e4rse PHP-standardi igasuguste sissetulevate HTTP-p\u00e4ringute esitlemiseks. Meie puhul <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 PSR-7 formaati<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> , et see oleks koosk\u00f5las enamikku t\u00e4nap\u00e4evaste PHP-raamistikega.<\/a><\/noindex>Kuna PSR-7 on muutumatu (keegi \u00fctleb, et tehniliselt see nii pole), peavad arendajad kirjutama rakendusi, mis ei k\u00e4sitle p\u00e4ringut globaalse olendina. See sobib suurep\u00e4raselt pikaajaliste PHP-protsesside kontseptsiooniga. Meie l\u00f5plik teostus, mis ei ole veel nime saanud, n\u00e4gi v\u00e4lja nii:<\/p>\n<p>Tutvustame RoadRunnerit \u2014<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP pole loodud surema, v\u00f5i Golang kiirustab appi\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>k\u00f5rge j\u00f5udlusega PHP-rakenduste server<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> Meie esimene test\u00fclesanne oli API-tagumine, kus tekkis perioodiliselt ettearvamatuid \u00fclekoormusi (kordades rohkem kui tavaliselt). Kuigi enamikul juhtudel oli nginx'i v\u00f5imalustest piisavalt, seisime pidevalt silmitsi veaga 502, sest ei suutnud s\u00fcsteemi piisavalt kiiresti tasakaalustada oodatava koormuse suurenemisega.<\/a><\/noindex><\/h3>\n<p>\nSelle lahenduse asendamiseks alustasime 2018. aasta alguses oma esimest PHP\/Go-rakenduste serverit. Ja kohe saime uskumatuid tulemusi! Me mitte ainult ei vabanenud veast 502, vaid suutsime v\u00e4hendada serverite arvu kolmandiku v\u00f5rra, s\u00e4\u00e4stes palju raha ja valu tablettide jaoks inseneridele ja tootjate juhtidele.<\/p>\n<p>Kuna 2018. aasta alguses, et asendada see lahendus, k\u00e4ivitasime meie esimese PHP\/Go rakenduste serveri. Ja kohe saime uskumatuid tulemusi! Me mitte ainult ei k\u00f5rvaldanud 502 viga, vaid suutsime ka serverite arvu kolmandiku v\u00f5rra v\u00e4hendada, s\u00e4\u00e4stes tohutult raha ja n\u00e4rve inseneridele ja tootem\u00e4ned\u017eeridele.<\/p>\n<p>Aasta keskpaiku t\u00e4iustasime oma lahendust, avaldasime selle GitHubis MIT-i litsentsi all ja kutsusime seda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, r\u00f5hutades seel\u00e4bi selle uskumatut kiirus ja efektiivsust.<\/p>\n<h3>Kuidas RoadRunner saab teie arendussteki parandada<\/h3>\n<p>\nRakendamine<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> lubas meil kasutada Middleware net\/http Go pool, et teha JWT-sertifikaati juba enne, kui p\u00e4ring j\u00f5uab PHP-sse, samuti WebSocketite t\u00f6\u00f6tlemiseks ja globaalsete olekute koondamiseks Prometheuses. <\/p>\n<p>Sisseehitatud RPC v\u00f5imaldab avada API igasuguste Go-teekide jaoks PHP-s ilma laienduste-m\u00e4histe kirjutamiseta. Veelgi olulisem on see, et RoadRunneriga on v\u00f5imalik juurutada uusi servereid, mis ei piirdu HTTP-ga. N\u00e4iteks v\u00f5ime mainida PHP t\u00f6\u00f6tlejate k\u00e4ivitamist<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, usaldusv\u00e4\u00e4rsete j\u00e4rjekorraparserside loomist ja isegi lisamist<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> meie rakendustesse.<\/p>\n<p>Koos PHP ja Go kogudega oleme t\u00f5stnud lahenduse stabiilsust, m\u00f5ningates testides suurendanud rakenduste j\u00f5udlust kuni 40 korda, t\u00e4iustanud silumisvahendeid, rakendanud integratsiooni Symfony raamistiku ja lisanud HTTPS-i, HTTP\/2, pistikute ja PSR-17 toe.<\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\nM\u00f5ned inimesed on endiselt kinni vananenud arvamuses, et PHP on aeglane ja mahukas keel, mis sobib ainult WordPressi pistikprogrammide kirjutamiseks. Need inimesed v\u00f5ivad isegi \u00f6elda, et PHP-l on selline piirang: kui rakendus muutub piisavalt suureks, peab valima \u201ek\u00fcpsema\u201d keele ja \u00fcmber kirjutama aastate jooksul kogunenud koodibaasi.<\/p>\n<p>Sellele k\u00f5igile tahaksime vastata: m\u00f5elge uuesti. Me usume, et ainult teie ise seab m\u00f5ned piirangud PHP-le. Te v\u00f5ite kulutada kogu elu, liikudes \u00fchest keelest teise, p\u00fc\u00fcdes leida oma vajadustega ideaalset kombinatsiooni, v\u00f5i hakata keeli k\u00e4sitlema kui t\u00f6\u00f6riistu. Kujuteldavad puudused nagu PHP v\u00f5ivad tegelikult olla selle eduka kasvu p\u00f5hjused. Ja kui \u00fchendada see m\u00f5ne teise keelega nagu Go, siis loote palju v\u00f5imsamaid tooteid, kui kui piirdute vaid \u00fche keele kasutamisega.<\/p>\n<p>T\u00f6\u00f6tades Go ja PHP kombinatsiooniga, v\u00f5ime kinnitada, et oleme neid armastanud. Me ei kavatse \u00fchte ohverdada teise nimel \u2014 vastupidi, me otsime viise, kuidas sellest kahefstrahi veelgi rohkem kasu saada.<\/p>\n<p><i>UPD: tervitame RoadRunneri loojat ja originaali artikli kaasautor - <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.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\/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.1.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 surema, v\u00f5i Golang kiirustab appi | 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}]}}