{"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\/hr\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP nije stvoren da umre, ili Golang po\u017euruje u pomo\u0107","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP nije stvoren da umre, ili Golang po\u017euruje u pomo\u0107\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPozdrav, Habr! Aktivno radimo u Badoo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">na performansama PHP-a<\/a><\/noindex>, s obzirom na to da imamo prili\u010dno veliki sistem na ovom jeziku i pitanje performansi je pitanje u\u0161tede novca. Prije vi\u0161e od deset godina stvorili smo PHP-FPM, koji je isprva bio skup zakrpa za PHP, a kasnije je postao deo slu\u017ebenog izdanja.<\/p>\n<p>Tokom poslednjih godina PHP je zna\u010dajno napredovao: pobolj\u0161an je sakuplja\u010d sme\u0107a, a nivo stabilnosti se pove\u0107ao \u2014 danas je mogu\u0107e pisati demone i dugotrajne skripte na PHP-u bez ve\u0107ih problema. To je omogu\u0107ilo Spiral Scout-u da ide dalje: RoadRunner, za razliku od PHP-FPM-a, ne \u010disti memoriju izme\u0111u zahteva, \u0161to donosi dodatne performanse (iako ovaj pristup komplikuje proces razvoja). Trenutno eksperimenti\u0161emo s ovim alatom, ali zasad nemamo rezultata koje bismo mogli podeliti. Da \u010dekanje bude zabavnije, <b>publikujemo prevo\u0111enje najave RoadRunner-a od Spiral Scout-a.<\/b><\/p>\n<p>Pristup iz \u010dlanka nam je blizak: u re\u0161avanju svojih zadataka naj\u010de\u0161\u0107e koristimo kombinaciju PHP-a i Go-a, dobijaju\u0107i prednosti oba jezika i ne odri\u010du\u0107i se jednog u korist drugog.<\/p>\n<p>U\u017eivajte!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Tokom poslednjih deset godina razvijali smo aplikacije i za kompanije sa liste <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, i za biznise sa manje od 500 korisnika. Tokom sveg ovog vremena na\u0161i in\u017eenjeri su uglavnom razvijali backend prete\u017eno na PHP-u. Me\u0111utim, pre dve godine ne\u0161to je sna\u017eno uticalo ne samo na performanse na\u0161ih proizvoda, ve\u0107 i na njihovu skalabilnost \u2014 uveli smo Golang (Go) u na\u0161 tehnolo\u0161ki stek.<\/p>\n<p>Gotovo odmah smo otkrili da nam Go omogu\u0107ava da kreiramo ve\u0107e aplikacije uz pove\u0107anje performansi do 40 puta. Uz njegovu pomo\u0107 mogli smo da pro\u0161irujemo postoje\u0107e proizvode napisane na PHP-u, unapre\u0111uju\u0107i ih zahvaljuju\u0107i kombinaciji prednosti oba jezika.<\/p>\n<p>Ispri\u010da\u0107emo kako kombinacija Go-a i PHP-a poma\u017ee u re\u0161avanju stvarnih razvojnih zadataka i kako je postala alat koji mo\u017ee osloboditi deo problema povezanih sa <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">modelom \"umiranja\" PHP-a<\/a><\/noindex>.<\/p>\n<h3>Va\u0161e svakodnevno okru\u017eenje PHP-razvoja<\/h3>\n<p>\nPre nego \u0161to pri\u010damo o tome kako Go mo\u017ee o\u017eiveti model \"umiranja\" PHP-a, hajde da razmotrimo va\u0161e standardno okru\u017eenje PHP-razvoja.<\/p>\n<p>U ve\u0107ini slu\u010dajeva pokre\u0107ete aplikaciju pomo\u0107u kombinacije web poslu\u017eitelja nginx i PHP-FPM poslu\u017eitelja. Prvi se brine o stati\u010dkim datotekama i proslje\u0111uje specifi\u010dne zahtjeve PHP-FPM-u, dok sam PHP-FPM izvr\u0161ava PHP kod. Mo\u017eda koristite manje popularnu kombinaciju Apache i mod_php. No, iako radi malo druga\u010dije, principi su isti.<\/p>\n<p>Pogledajmo kako PHP-FPM izvr\u0161ava kod aplikacije. Kada stigne zahtjev, PHP-FPM inicijalizira podproces PHP-a i proslje\u0111uje detalje zahtjeva kao dio njegovog stanja (_GET, _POST, _SERVER itd.). <\/p>\n<p>Stanje se ne mo\u017ee mijenjati tijekom izvr\u0161avanja PHP skripte, stoga je mogu\u0107e dobiti novi skup ulaznih podataka samo na jedan na\u010din: \u010di\u0161\u0107enjem memorije procesa i ponovnim inicijaliziranjem.<\/p>\n<p>Ovaj model izvr\u0161avanja ima mnogo prednosti. Ne morate previ\u0161e brinuti o potro\u0161nji memorije, svi procesi su potpuno izolirani, a ako jedan od njih \u201eumre\u201c, automatski \u0107e se obnoviti i to ne\u0107e utjecati na ostale procese. No, ova metoda ima i nedostatke koji se pojavljuju prilikom poku\u0161aja skaliranja aplikacije.<\/p>\n<h3>Nedostaci i neu\u010dinkovitost obi\u010dnog PHP okru\u017eenja<\/h3>\n<p>\nAko se bavite profesionalnim razvojem na PHP-u, znate s \u010dega zapo\u010deti novi projekt - od odabira frameworka. On predstavlja biblioteke za uvo\u0111enje ovisnosti, ORM-ove, prijevode i predlo\u0161ke. I, naravno, sve ulazne korisni\u010dke podatke mo\u017eete lako staviti u jedan objekt (Symfony\/HttpFoundation ili PSR-7). Frameworki su odli\u010dni!<\/p>\n<p>No, sve to ima svoju cijenu. U svakom frameworku razine poduze\u0107a za obradu jednostavnog korisni\u010dkog zahtjeva ili poziva na BDP morat \u0107ete u\u010ditati najmanje desetke datoteka, stvoriti brojne klase i obraditi nekoliko konfiguracija. No, najgore od svega je to \u0161to nakon izvr\u0161avanja svake zada\u0107e morate sve poni\u0161titi i zapo\u010deti ispo\u010detka: sav onaj kod koji ste upravo inicirali postaje beskoristan, s njim vi\u0161e ne mo\u017eete obraditi jo\u0161 jedan zahtjev. Recite ovo bilo kojem programeru koji pi\u0161e na nekom drugom jeziku - i vidjet \u0107ete zbunjenost na njegovom licu.<\/p>\n<p>PHP programeri su godinama tra\u017eili na\u010dine za rje\u0161avanje ovog problema, koriste\u0107i razra\u0111ene metode \"lenjog\" u\u010ditavanja, mikrorokframe, optimizirane biblioteke, cache itd. No, na kraju se ipak moraju resetirati cijela aplikacija i po\u010deti iznova, ponovno i ponovno.<i> (Napomena prevoditelja: djelomi\u010dno \u0107e ovaj problem biti rije\u0161en s pojavom <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> u PHP 7.4)<\/p>\n<h3>Mo\u017ee li PHP uz pomo\u0107 Go pre\u017eivjeti vi\u0161e od jednog zahtjeva?<\/h3>\n<p>\n<\/i>Mogu se napisati PHP skripte koje \u0107e trajati dulje od nekoliko minuta (\u010dak do sati ili dana): na primjer, cron zadaci, CSV parseri, razbija\u010di redova. Svi oni rade po istom scenariju: izvla\u010de zadatak, izvr\u0161avaju ga, \u010dekaju sljede\u0107e. Kod konstantno ostaje u memoriji, \u0161tede\u0107i dragocjene milisekunde, jer u\u010ditavanje frameworka i aplikacije zahtijeva ostvarivanje mno\u0161tva dodatnih radnji.<\/p>\n<p>No, razvijati dugotrajne skripte nije tako jednostavno. Svaka gre\u0161ka potpuno ubija proces, dijagnosticiranje curenja memorije dovodi do ludila, a kori\u0161tenje F5 za debagiranje vi\u0161e nije mogu\u0107e.<\/p>\n<p>Situacija se pobolj\u0161ala izlaskom PHP 7: uveden je pouzdan sakuplja\u010d sme\u0107a, olak\u0161ano je upravljanje gre\u0161kama, a pro\u0161irenja jezgre sada su za\u0161ti\u0107ena od curenja. Me\u0111utim, in\u017eenjeri se jo\u0161 uvijek moraju pa\u017eljivo odnositi prema memoriji i imati na umu probleme stanja u kodu (postoji li jezik koji mo\u017ee ignorirati te probleme?). Ipak, u PHP 7 nas manje iznena\u0111enja o\u010dekuje.<\/p>\n<p>Mo\u017ee li se uzeti model rada s dugotrajnim PHP skriptama, prilagoditi ga za trivijalnije zadatke poput obrade HTTP zahtjeva i tako eliminirati potrebu za u\u010ditavanjem svega iz po\u010detka s svakim zahtjevom?<\/p>\n<p>Za rje\u0161avanje ovog zadatka prvo je bilo potrebno realizirati serversku aplikaciju koja mo\u017ee primati HTTP zahtjeve i usmjeravati ih jedan po jedan PHP radniku, ne ubijaju\u0107i ga svaki put.<\/p>\n<p>Znali smo da mo\u017eemo napisati web server u \u010distom PHP-u (PHP-PM) ili koriste\u0107i C-ekstenziju (Swoole). Iako svaki pristup ima svoje prednosti, ni jedna varijanta nam nije odgovarala - \u017eeljeli smo ne\u0161to vi\u0161e. Trebao nam je ne samo web server - o\u010dekivali smo rje\u0161enje koje \u0107e nas osloboditi problema 'te\u0161kog starta' u PHP-u, a koje se lako mo\u017ee prilagoditi i pro\u0161iriti za specifi\u010dne aplikacije. Drugim rije\u010dima, trebao nam je aplikacijski server.<\/p>\n<p>Mo\u017ee li Go pomo\u0107i u tome? Znali smo da mo\u017ee, jer ovaj jezik kompilira aplikacije u pojedina\u010dne binarne datoteke; je vi\u0161ep \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043cen; koristi vlastiti, vrlo elegantan model paralelne obrade (concurrency) i biblioteku za rad s HTTP-om; i na kraju, bit \u0107e nam dostupne tisu\u0107e open-source biblioteka i integracija.<\/p>\n<h3>Te\u0161ko\u0107e kombiniranja dvaju programskih jezika<\/h3>\n<p>\nPrvo je trebalo odrediti kako \u0107e se dvije ili vi\u0161e aplikacija me\u0111usobno komunicirati.<\/p>\n<p>Na primjer, kroz<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> predivnu biblioteku<\/a><\/noindex> Alexa Paleastrasa, moglo se implementirati dijeljenje memorije izme\u0111u PHP i Go procesa (slu\u017ebeni mod_php u Apache-u). No, ova biblioteka ima karakteristike koje ograni\u010davaju njezinu primjenu za rje\u0161avanje na\u0161eg zadatka.<\/p>\n<p>Odlu\u010dili smo se za drugi, ra\u0161ireniji pristup: izgraditi interakciju izme\u0111u procesa putem soketa\/pipelinea. Ovaj je pristup u posljednjim desetlje\u0107ima dokazao svoju pouzdanost i dobro je optimiziran na razini operacijskog sustava.<\/p>\n<p>Na po\u010detku smo stvorili jednostavan binarni protokol za razmjenu podataka izme\u0111u procesa i obradu gre\u0161aka prijenosa. U svojoj najjednostavnijoj formi, protokol ovog tipa nalikuje <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> s<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> s fiksno velikim zaglavljem paketa<\/a><\/noindex> (u na\u0161em slu\u010daju 17 bajtova), koje sadr\u017ei informacije o vrsti paketa, njegovoj veli\u010dini i binarnu masku za provjeru integriteta podataka.<\/p>\n<p>Na strani PHP-a koristili smo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">funkciju pack<\/a><\/noindex>, a na strani Go - biblioteku<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Jednog protokola nam se \u010dinilo premalo - dodali smo mogu\u0107nost pozivanja<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> Go usluga net\/rpc izravno iz PHP-a<\/a><\/noindex>. Kasnije nam je to vrlo pomoglo u razvoju, jer smo lako mogli integrirati Go biblioteke u PHP aplikacije. Rezultat ovog rada mo\u017ee se vidjeti, na primjer, u na\u0161em drugom open-source proizvodu<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Raspodjela zadataka me\u0111u vi\u0161e PHP radnika<\/h3>\n<p>\nNakon implementacije mehanizma interakcije, po\u010deli smo razmi\u0161ljati o najefikasnijem na\u010dinu prijenosa zadataka PHP procesima. Kada stigne zadatak, aplikacijski poslu\u017eitelj mora odabrati slobodnog radnika za njegovo izvr\u0161enje. Ako radnik\/proces zavr\u0161i s gre\u0161kom ili se \"sru\u0161i\", osloba\u0111amo ga i stvaramo novog u zamjenu. A ako je radnik\/proces uspje\u0161no izvr\u0161en, vra\u0107amo ga u bazen radnika dostupnih za izvr\u0161enje zadataka.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP nije stvoren da umre, ili Golang po\u017euruje u pomo\u0107\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZa pohranu bazena aktivnih radnika koristili smo<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> bufferirani kanal<\/a><\/noindex>, kako bismo uklonili nepredvi\u0111eno \"sru\u0161ene\" radnike, dodali smo mehanizam pra\u0107enja gre\u0161aka i stanja radnika.<\/p>\n<p>Kao rezultat, dobili smo funkcionalni PHP poslu\u017eitelj sposoban obraditi sve zahtjeve predstavljene u binarnom formatu.<\/p>\n<p>Da bi na\u0161a aplikacija po\u010dela raditi kao web poslu\u017eitelj, morali smo odabrati pouzdan PHP standard za predstavljanje bilo kojih dolaznih HTTP zahtjeva. U na\u0161em slu\u010daju jednostavno <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">pretvaramo<\/a><\/noindex> net\/http zahtjev iz Go-a u format<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, kako bi bio kompatibilan s ve\u0107inom dostupnih PHP okvira danas.<\/p>\n<p>Budu\u0107i da se PSR-7 smatra nepromjenjivim (neki bi rekli da tehni\u010dki to nije tako), programerima je potrebno pisati aplikacije koje, u principu, ne tretiraju zahtjev kao globalnu entitet. To se odli\u010dno uklapa u koncept dugotrajnih PHP procesa. Na\u0161a kona\u010dna implementacija, koja jo\u0161 nema naziv, izgledala je ovako:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP nije stvoren da umre, ili Golang po\u017euruje u pomo\u0107\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Predstavljamo RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> visokou\u010dinkoviti poslu\u017eitelj PHP aplikacija<\/a><\/noindex><\/h3>\n<p>\nNa\u0161 prvi testni zadatak bio je API backend, na kojem su povremeno nepredvidivo nastajali porasti zahtjeva (daleko \u010de\u0161\u0107e nego obi\u010dno). Iako su u ve\u0107ini slu\u010dajeva mogu\u0107nosti nginx-a bile dovoljne, redovito smo se susretali s gre\u0161kom 502, jer nismo mogli dovoljno brzo balansirati sustav za o\u010dekivano pove\u0107anje optere\u0107enja.<\/p>\n<p>Za zamjenu ovog rje\u0161enja, po\u010detkom 2018. godine implementirali smo na\u0161 prvi PHP\/Go aplikacijski poslu\u017eitelj. I odmah smo dobili nevjerojatan u\u010dinak! Ne samo da smo potpuno eliminirali gre\u0161ku 502, ve\u0107 smo tako\u0111er uspjeli smanjiti broj poslu\u017eitelja za dvije tre\u0107ine, u\u0161tedev\u0161i gomilu novca i tableta protiv glavobolje za in\u017eenjere i menad\u017eere proizvoda.<\/p>\n<p>Sredinom godine pobolj\u0161ali smo na\u0161e rje\u0161enje, objavili ga na GitHubu pod MIT licencom i nazvali <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, isti\u010du\u0107i njegovu nevjerojatnu brzinu i u\u010dinkovitost.<\/p>\n<h3>Kako RoadRunner mo\u017ee pobolj\u0161ati va\u0161 razvojni stog<\/h3>\n<p>\nPrimjena<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> omogu\u0107ilo nam je kori\u0161tenje Middleware net\/http na strani Go, kako bismo provodili JWT-verifikaciju prije nego \u0161to zahtjev dospije do PHP-a, kao i za obradu WebSocketa i globalno aggregeranje stanja u Prometheus. <\/p>\n<p>Zahvaljuju\u0107i ugra\u0111enom RPC-u mo\u017eemo otvoriti API bilo kojih Go-biblioteka za PHP bez pisanja wrapper ekstenzija. \u0160to je jo\u0161 va\u017enije, uz RoadRunner mo\u017eemo implementirati nove servere, razli\u010dite od HTTP-a. Primjeri uklju\u010duju pokretanje PHP obradnika<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, kreiranje pouzdanih raspore\u0111iva\u010da i \u010dak dodavanje<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> u na\u0161e aplikacije.<\/p>\n<p>Uz zajednice PHP-a i Go-a pobolj\u0161ali smo stabilnost rje\u0161enja, u nekim testovima pove\u0107ali performanse aplikacija do 40 puta, unaprijedili alate za otklanjanje gre\u0161aka, implementirali integraciju s Symfony okvirom i dodali podr\u0161ku za HTTPS, HTTP\/2, dodatke i PSR-17.<\/p>\n<h3>Zaklju\u010dak<\/h3>\n<p>\nNeki jo\u0161 uvijek \u017eive u zastarjelom uvjerenju da je PHP spor i nezgrapan jezik, pogodan samo za pisanje dodataka za WordPress. Ti ljudi mogu re\u0107i da PHP ima odre\u0111eno ograni\u010denje: kada aplikacija postane dovoljno velika, mora se odabrati \u201ezreliji\u201c jezik i prepisati akumulirani kod koji traje godinama.<\/p>\n<p>Na sve to \u017eelimo odgovoriti: razmislite ponovno. Smatramo da samo vi sami postavljate neka ograni\u010denja za PHP. Mo\u017eete potro\u0161iti cijeli \u017eivot prelaze\u0107i s jednog jezika na drugi, poku\u0161avaju\u0107i prona\u0107i idealnu kombinaciju s va\u0161im potrebama, ili mo\u017eete po\u010deti gledati na jezike kao na alate. Izmi\u0161ljeni nedostaci jezika poput PHP-a zapravo mogu biti uzroci njegovog uspjeha. A ako ga spojite s drugim jezikom poput Go-a, stvorit \u0107ete mnogo sna\u017enije proizvode nego da ste se ograni\u010dili na kori\u0161tenje samo jednog jezika.<\/p>\n<p>Radili smo sa spojem Go i PHP i mo\u017eemo re\u0107i da smo ih zavoljeli. Ne planiramo \u017ertvovati jedan za drugi \u2014 naprotiv, tra\u017eit \u0107emo na\u010dine da izvu\u010demo jo\u0161 vi\u0161e koristi iz ovog dvostrukog stoga.<\/p>\n<p><i>UPD: pozdravljamo kreatora RoadRunner-a i co-autora originalnog \u010dlanka \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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 nije stvoren da umre, ili Golang priska u pomo\u0107 | ProHoster","description":"Bok, Habr!","canonical_url":"https:\/\/prohoster.info\/hr\/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":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}