{"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\/hu\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: A PHP nem arra k\u00e9sz\u00fclt, hogy meghaljon, vagy a Golang siet a seg\u00edts\u00e9g\u00e9re","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: A PHP nem arra k\u00e9sz\u00fclt, hogy meghaljon, vagy a Golang siet a seg\u00edts\u00e9g\u00e9re\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHell\u00f3, Habr! Mi a Badoo-n\u00e1l akt\u00edvan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">dolgozunk a PHP teljes\u00edtm\u00e9ny\u00e9n<\/a><\/noindex>, mivel el\u00e9g nagy rendszer\u00fcnk van ezen a nyelven, \u00e9s a teljes\u00edtm\u00e9ny k\u00e9rd\u00e9se p\u00e9nzmegtakar\u00edt\u00e1st jelent. T\u00f6bb mint t\u00edz \u00e9ve l\u00e9trehoztuk a PHP-FPM-et, ami el\u0151sz\u00f6r PHP patch-ek\u00e9nt indult, k\u00e9s\u0151bb pedig beker\u00fclt a hivatalos terjeszt\u00e9sbe.<\/p>\n<p>Az elm\u00falt \u00e9vekben a PHP jelent\u0151s el\u0151rel\u00e9p\u00e9sen ment kereszt\u00fcl: javult a szem\u00e9tgy\u0171jt\u0151, n\u00f6vekedett a stabilit\u00e1s szintje \u2014 ma m\u00e1r a PHP-n k\u00f6nnyed\u00e9n lehet demon-st\u00edlus\u00fa \u00e9s hossz\u00fa \u00e9let\u0171 szkripteket \u00edrni. Ez lehet\u0151v\u00e9 tette a Spiral Scout sz\u00e1m\u00e1ra, hogy tov\u00e1bb l\u00e9pjen: a RoadRunner, ellent\u00e9tben a PHP-FPM-mel, nem \u00fcr\u00edti ki a mem\u00f3ri\u00e1t a k\u00e9r\u00e9sek k\u00f6z\u00f6tt, ami extra teljes\u00edtm\u00e9nyn\u00f6veked\u00e9st ad (b\u00e1r ez a megk\u00f6zel\u00edt\u00e9s bonyol\u00edtja a fejleszt\u00e9si folyamatot). Jelenleg k\u00eds\u00e9rletez\u00fcnk ezzel az eszk\u00f6zzel, de m\u00e9g nincsenek olyan eredm\u00e9nyeink, amelyeket megoszthatn\u00e1nk. Hogy a v\u00e1rakoz\u00e1s sz\u00f3rakoztat\u00f3bb legyen, <b>k\u00f6zz\u00e9 tessz\u00fck a Spiral Scout RoadRunner bejelent\u00e9s\u00e9nek ford\u00edt\u00e1s\u00e1t.<\/b><\/p>\n<p>A cikk megk\u00f6zel\u00edt\u00e9se k\u00f6zel \u00e1ll hozz\u00e1nk: feladataink megold\u00e1s\u00e1hoz mi is gyakran haszn\u00e1ljuk a PHP \u00e9s a Go kombin\u00e1ci\u00f3j\u00e1t, megszerezve mindk\u00e9t nyelv el\u0151nyeit an\u00e9lk\u00fcl, hogy lemondan\u00e1nk az egyikr\u0151l a m\u00e1sik jav\u00e1ra.<\/p>\n<p>J\u00f3 sz\u00f3rakoz\u00e1st!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Az utols\u00f3 t\u00edz \u00e9vben alkalmaz\u00e1sokat fejlesztett\u00fcnk mind a <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, mind az 500-n\u00e1l kevesebb felhaszn\u00e1l\u00f3val rendelkez\u0151 v\u00e1llalkoz\u00e1sok sz\u00e1m\u00e1ra. Ez id\u0151 alatt m\u00e9rn\u00f6keink t\u00falnyom\u00f3r\u00e9szt PHP-ra fejlesztett\u00e9k a backendet. De k\u00e9t \u00e9vvel ezel\u0151tt valami jelent\u0151sen befoly\u00e1solta nemcsak term\u00e9keink teljes\u00edtm\u00e9ny\u00e9t, hanem azok sk\u00e1l\u00e1zhat\u00f3s\u00e1g\u00e1t is \u2014 bevezett\u00fck a Golang (Go) nyelvet a technol\u00f3giai stack\u00fcnkbe.<\/p>\n<p>Szinte azonnal \u00e9szrevett\u00fck, hogy a Go lehet\u0151v\u00e9 teszi sz\u00e1munkra, hogy nagyobb alkalmaz\u00e1sokat hozzunk l\u00e9tre, 40-szeres teljes\u00edtm\u00e9nyn\u00f6veked\u00e9st el\u00e9rve. Ezzel k\u00e9pesek voltunk b\u0151v\u00edteni a megl\u00e9v\u0151 PHP-ra \u00edrt term\u00e9keket, jav\u00edtva \u0151ket a k\u00e9t nyelv el\u0151nyeinek kombin\u00e1ci\u00f3ja r\u00e9v\u00e9n.<\/p>\n<p>Elmondjuk, hogyan seg\u00edt a Go \u00e9s a PHP kombin\u00e1ci\u00f3ja a val\u00f3s fejleszt\u00e9si probl\u00e9m\u00e1k megold\u00e1s\u00e1ban, \u00e9s hogyan v\u00e1lt sz\u00e1munkra olyan eszk\u00f6zz\u00e9, amely k\u00e9pes megszabad\u00edtani a PHP <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">\u00bbmegfejt\u00e9si\u00ab modellj\u00e9vel kapcsolatos probl\u00e9m\u00e1k egy r\u00e9sz\u00e9t\u0151l.<\/a><\/noindex>.<\/p>\n<h3>A mindennapi PHP-fejleszt\u00e9si k\u00f6rnyezeted<\/h3>\n<p>\nMiel\u0151tt arr\u00f3l besz\u00e9ln\u00e9nk, hogyan lehet a Go seg\u00edts\u00e9g\u00e9vel \u00e9letre kelteni a PHP \u00bbmegfejt\u00e9si\u00ab modellj\u00e9t, n\u00e9zz\u00fck meg a szok\u00e1sos PHP-fejleszt\u00e9si k\u00f6rnyezetedet.<\/p>\n<p>A legt\u00f6bb esetben az alkalmaz\u00e1st az nginx webszerver \u00e9s a PHP-FPM szerver kombin\u00e1ci\u00f3j\u00e1val ind\u00edtja. Az els\u0151 statikus f\u00e1jlokat szolg\u00e1l ki, \u00e9s a PHP-FPM-nek speci\u00e1lis k\u00e9r\u00e9seket ir\u00e1ny\u00edt, m\u00edg a PHP-FPM v\u00e9grehajtja a PHP-k\u00f3dot. El\u0151fordulhat, hogy egy kev\u00e9sb\u00e9 n\u00e9pszer\u0171 Apache \u00e9s mod_php kombin\u00e1ci\u00f3t haszn\u00e1l. De b\u00e1r ez kicsit m\u00e1sk\u00e9pp m\u0171k\u00f6dik, az elvek ugyanazok.<\/p>\n<p>N\u00e9zz\u00fck meg, hogyan hajtja v\u00e9gre a PHP-FPM az alkalmaz\u00e1s k\u00f3dj\u00e1t. Amikor egy k\u00e9r\u00e9s \u00e9rkezik, a PHP-FPM inicializ\u00e1l egy gyermeket PHP-folyamatot, \u00e9s a k\u00e9r\u00e9s r\u00e9szleteit a folyamat \u00e1llapotak\u00e9nt adja \u00e1t (_GET, _POST, _SERVER stb. mint\u00e1kban). <\/p>\n<p>Az \u00e1llapot nem v\u00e1ltozhat meg a PHP-szkript v\u00e9grehajt\u00e1sa sor\u00e1n, ez\u00e9rt \u00faj bemeneti adatokat csak egyetlen m\u00f3don lehet beszerezni: a folyamat mem\u00f3ria t\u00f6rl\u00e9s\u00e9vel \u00e9s annak \u00fajb\u00f3li inicializ\u00e1l\u00e1s\u00e1val.<\/p>\n<p>Ennek a v\u00e9grehajt\u00e1si modellnek sz\u00e1mos el\u0151nye van. Nem kell nagyon agg\u00f3dni a mem\u00f3riafogyaszt\u00e1s miatt, minden folyamat teljesen izol\u00e1lt, \u00e9s ha az egyik \u201emeghal\u201d, automatikusan \u00fajra l\u00e9trehoz\u00e1sra ker\u00fcl, \u00e9s ez nem \u00e9rinti a t\u00f6bbi folyamatot. De ennek a megk\u00f6zel\u00edt\u00e9snek h\u00e1tr\u00e1nyai is vannak, amelyek a sz\u00e1m\u00edt\u00e1si alkalmaz\u00e1s m\u00e9retez\u00e9s\u00e9nek megk\u00eds\u00e9rl\u00e9sekor jelentkeznek.<\/p>\n<h3>A hagyom\u00e1nyos PHP-k\u00f6rnyezet h\u00e1tr\u00e1nyai \u00e9s hat\u00e9konys\u00e1gi probl\u00e9m\u00e1i<\/h3>\n<p>\nHa professzion\u00e1lisan fejleszt PHP-t, tudja, hogy \u00faj projekt ind\u00edt\u00e1s\u00e1nak alapvet\u0151 l\u00e9p\u00e9se a keretrendszer kiv\u00e1laszt\u00e1sa. Ez olyan k\u00f6nyvt\u00e1rakat tartalmaz, amelyek a f\u00fcgg\u0151s\u00e9gek bevezet\u00e9s\u00e9re, ORM-ekre, ford\u00edt\u00e1sokra \u00e9s sablonokra szolg\u00e1lnak. \u00c9s term\u00e9szetesen minden felhaszn\u00e1l\u00f3i bemeneti adatokat egy objektumba lehet k\u00e9nyelmesen csomagolni (Symfony\/HttpFoundation vagy PSR-7). A keretrendszerek nagyszer\u0171ek!<\/p>\n<p>De mindennek van \u00e1ra. B\u00e1rmely v\u00e1llalati szint\u0171 keretrendszerben ahhoz, hogy egyszer\u0171 felhaszn\u00e1l\u00f3i k\u00e9r\u00e9seket vagy adatb\u00e1zis-h\u00edv\u00e1sokat kezeljen, legal\u00e1bb tucatnyi f\u00e1jlt kell bet\u00f6lteni, sz\u00e1mos oszt\u00e1lyt l\u00e9trehozni, \u00e9s t\u00f6bb konfigur\u00e1ci\u00f3t elemezni. De a legrosszabb, hogy minden egyes feladat v\u00e9grehajt\u00e1sa ut\u00e1n mindent \u00fajra kell kezdeni: az \u00f6n \u00e1ltal \u00e9ppen kezdem\u00e9nyezett k\u00f3d haszontalann\u00e1 v\u00e1lik, mivel azzal m\u00e1r nem tud \u00fajabb k\u00e9r\u00e9st kezelni. Ezt mondja el b\u00e1rmely programoz\u00f3nak, aki m\u00e1s nyelveken \u00edr \u2014 \u00e9s meg fogja l\u00e1tni az arc\u00e1n a zavart.<\/p>\n<p>A PHP-fejleszt\u0151k \u00e9vek \u00f3ta keresik a megold\u00e1st erre a probl\u00e9m\u00e1ra, kidolgozott \"lust\u00e1n\" bet\u00f6lt\u00e9si m\u00f3dszereket, mikrofframework\u00f6ket, optimaliz\u00e1lt k\u00f6nyvt\u00e1rakat, cache-t stb. De v\u00e9g\u00fcl is mindig le kell \u00e1ll\u00edtani az eg\u00e9sz alkalmaz\u00e1st, \u00e9s \u00fajrakezdeni, ism\u00e9telten.<i> (A ford\u00edt\u00f3 megjegyz\u00e9se: ez a probl\u00e9ma r\u00e9szben megold\u00f3dik a <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> PHP 7.4) megjelen\u00e9s\u00e9vel.<\/p>\n<h3>T\u00fal\u00e9lheti-e a PHP a Go seg\u00edts\u00e9g\u00e9vel t\u00f6bb mint egy k\u00e9r\u00e9st?<\/h3>\n<p>\n<\/i>\u00cdrhatunk PHP szkripteket, amelyek t\u00f6bb percn\u00e9l hosszabb ideig fennmaradhatnak (\u00f3r\u00e1kig vagy napokig): p\u00e9ld\u00e1ul cron-feladatok, CSV-elemz\u0151k, sorfeldolgoz\u00f3k. Mindegyik egy forgat\u00f3k\u00f6nyv szerint m\u0171k\u00f6dik: felveszi a feladatot, v\u00e9grehajtja, v\u00e1rja a k\u00f6vetkez\u0151t. A k\u00f3d folyamatosan a mem\u00f3ri\u00e1ban van, ezzel \u00e9rt\u00e9kes milliszekundumokat takar\u00edtva meg, mivel a keretrendszer \u00e9s az alkalmaz\u00e1s bet\u00f6lt\u00e9s\u00e9hez sz\u00e1mos extra l\u00e9p\u00e9st kell v\u00e9grehajtani.<\/p>\n<p>De a hossz\u00fa \u00e9lettartam\u00fa szkriptek fejleszt\u00e9se nem olyan egyszer\u0171. B\u00e1rmilyen hiba teljesen meg\u00f6lheti a folyamatot, a mem\u00f3ria sziv\u00e1rg\u00e1sok diagnosztiz\u00e1l\u00e1sa \u0151r\u00fcletesen neh\u00e9z, \u00e9s m\u00e1r nem lehet az F5-\u00f6t haszn\u00e1lni a hibakeres\u00e9shez.<\/p>\n<p>A helyzet javult a PHP 7 megjelen\u00e9s\u00e9vel: megb\u00edzhat\u00f3 szem\u00e9tgy\u0171jt\u0151 ker\u00fclt bevezet\u00e9sre, k\u00f6nnyebb lett a hib\u00e1k kezel\u00e9se, \u00e9s a magt\u00e1rol\u00f3k kib\u0151v\u00edt\u00e9se most m\u00e1r v\u00e9dve van a sziv\u00e1rg\u00e1sokt\u00f3l. Igaz, hogy a fejleszt\u0151knek m\u00e9g mindig \u00f3vatosan kell b\u00e1nniuk a mem\u00f3ri\u00e1val, \u00e9s figyelembe kell venni\u00fck a k\u00f3d \u00e1llapot\u00e1nak probl\u00e9m\u00e1it (van olyan nyelv, amelyn\u00e9l ezeket figyelmen k\u00edv\u00fcl lehet hagyni?). M\u00e9gis, a PHP 7-ben kevesebb meglepet\u00e9s v\u00e1r r\u00e1nk.<\/p>\n<p>Lehet-e a hossz\u00fa \u00e9let\u0171 PHP-szkriptek m\u0171k\u00f6d\u00e9si modellj\u00e9t alkalmazni a trivi\u00e1lisabb feladatokra, p\u00e9ld\u00e1ul a HTTP-k\u00e9r\u00e9sek feldolgoz\u00e1s\u00e1ra, \u00e9s ezzel megszabadulni att\u00f3l a sz\u00fcks\u00e9gt\u0151l, hogy minden k\u00e9r\u00e9sn\u00e9l minden \u00fajra kellene bet\u00f6lteni?<\/p>\n<p>E feladat megold\u00e1s\u00e1hoz el\u0151sz\u00f6r egy szerveralkalmaz\u00e1st kellett megval\u00f3s\u00edtani, amely k\u00e9pes HTTP-k\u00e9r\u00e9seket fogadni, \u00e9s azokat egym\u00e1s ut\u00e1n \u00e1tir\u00e1ny\u00edtani a PHP-munkav\u00e1llal\u00f3nak an\u00e9lk\u00fcl, hogy minden alkalommal meg\u00f6lni kellene.<\/p>\n<p>Tudtuk, hogy webkiszolg\u00e1l\u00f3t tudunk \u00edrni tiszta PHP-val (PHP-PM) vagy C-b\u0151v\u00edtm\u00e9nnyel (Swoole). B\u00e1r mindk\u00e9t m\u00f3dszernek megvannak a maga el\u0151nyei, egyik sem el\u00e9g\u00edtette ki az ig\u00e9nyeinket \u2014 valami t\u00f6bbre v\u00e1gytunk. Nem csup\u00e1n webkiszolg\u00e1l\u00f3ra volt sz\u00fcks\u00e9g\u00fcnk \u2014 olyan megold\u00e1st v\u00e1rtunk, amely seg\u00edtene a PHP \u201enehezen indul\u201d probl\u00e9m\u00e1ival megbirk\u00f3zni, \u00e9s amelyet k\u00f6nnyen alkalmazhatunk \u00e9s b\u0151v\u00edthet\u00fcnk konkr\u00e9t alkalmaz\u00e1sokhoz. Teh\u00e1t nek\u00fcnk alkalmaz\u00e1sszerverre volt sz\u00fcks\u00e9g\u00fcnk.<\/p>\n<p>Seg\u00edthet-e a Go ebben? Tudtuk, hogy igen, mert ez a nyelv egyes\u00edti az alkalmaz\u00e1sokat egyetlen bin\u00e1ris f\u00e1jlba; platformf\u00fcggetlen; saj\u00e1t, nagyon eleg\u00e1ns p\u00e1rhuzamos feldolgoz\u00e1si (concurrency) modellt \u00e9s HTTP k\u00f6nyvt\u00e1rat haszn\u00e1l; v\u00e9g\u00fcl pedig hozz\u00e1f\u00e9rhet\u00fcnk ezrek open-source k\u00f6nyvt\u00e1rhoz \u00e9s integr\u00e1ci\u00f3hoz.<\/p>\n<h3>A k\u00e9t programoz\u00e1si nyelv egyes\u00edt\u00e9se sor\u00e1n felmer\u00fcl\u0151 neh\u00e9zs\u00e9gek<\/h3>\n<p>\nEls\u0151 l\u00e9p\u00e9sk\u00e9nt meg kellett hat\u00e1roznunk, hogyan fognak kommunik\u00e1lni egym\u00e1ssal k\u00e9t vagy t\u00f6bb alkalmaz\u00e1s.<\/p>\n<p>P\u00e9ld\u00e1ul az<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> csod\u00e1latos k\u00f6nyvt\u00e1r seg\u00edts\u00e9g\u00e9vel<\/a><\/noindex> Alex Palas\u00e9trasz k\u00f6nyvt\u00e1ra lehet\u0151v\u00e9 tette a PHP \u00e9s a Go k\u00f6z\u00f6tti mem\u00f3ria megoszt\u00e1st (hasonl\u00f3an a mod_php-hoz az Apache-ban). Azonban ez a k\u00f6nyvt\u00e1r bizonyos saj\u00e1toss\u00e1gokkal rendelkezik, amelyek korl\u00e1tozz\u00e1k a haszn\u00e1lat\u00e1t a feladatunk megold\u00e1s\u00e1ra.<\/p>\n<p>Egy m\u00e1sik, elterjedtebb megk\u00f6zel\u00edt\u00e9st v\u00e1lasztottunk: a folyamatok k\u00f6z\u00f6tti interakci\u00f3t socketekkel\/cs\u00f6vekkel \u00e9p\u00edtj\u00fck fel. Ez a megk\u00f6zel\u00edt\u00e9s az ut\u00f3bbi \u00e9vtizedekben bizony\u00edtottan megb\u00edzhat\u00f3 volt, \u00e9s j\u00f3l optimaliz\u00e1lt\u00e1k az oper\u00e1ci\u00f3s rendszerek szintj\u00e9n.<\/p>\n<p>El\u0151sz\u00f6r is l\u00e9trehoztunk egy egyszer\u0171 bin\u00e1ris protokollt az adatok folyamatok k\u00f6z\u00f6tti cser\u00e9j\u00e9re \u00e9s a k\u00fcld\u00e9si hib\u00e1k kezel\u00e9s\u00e9re. A legegyszer\u0171bb form\u00e1j\u00e1ban az ilyen t\u00edpus\u00fa protokoll hasonl\u00edt a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> a<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> fix m\u00e9ret\u0171 csomagfejl\u00e9cre<\/a><\/noindex> (a mi eset\u00fcnkben 17 byte), amely tartalmazza a csomag t\u00edpus\u00e1r\u00f3l, a m\u00e9ret\u00e9r\u0151l \u00e9s a bin\u00e1ris maszkr\u00f3l sz\u00f3l\u00f3 inform\u00e1ci\u00f3t az adatok integrit\u00e1s\u00e1nak ellen\u0151rz\u00e9s\u00e9re.<\/p>\n<p>A PHP oldalon a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">pack<\/a><\/noindex>f\u00fcggv\u00e9nyt haszn\u00e1ltuk, a Go oldalon pedig az<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>protokoll nem bizonyult elegend\u0151nek \u2014 \u00e9s hozz\u00e1adtuk a lehet\u0151s\u00e9get, hogy k\u00f6zvetlen\u00fcl PHP-b\u00f3l h\u00edvjunk<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> Go-szolg\u00e1ltat\u00e1sokat net\/rpc seg\u00edts\u00e9g\u00e9vel<\/a><\/noindex>. K\u00e9s\u0151bb ez nagym\u00e9rt\u00e9kben seg\u00edtett minket a fejleszt\u00e9s sor\u00e1n, mivel k\u00f6nnyen integr\u00e1lhattuk a Go k\u00f6nyvt\u00e1rakat a PHP alkalmaz\u00e1sokba. E munk\u00e1nk eredm\u00e9ny\u00e9t p\u00e9ld\u00e1ul egy m\u00e1sik open-source term\u00e9k\u00fcnkben, a<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge-ben l\u00e1thatjuk.<\/a><\/noindex>.<\/p>\n<h3>Feladatok eloszt\u00e1sa t\u00f6bb PHP-munk\u00e1s k\u00f6z\u00f6tt<\/h3>\n<p>\nA kommunik\u00e1ci\u00f3s mechanizmus implement\u00e1l\u00e1sa ut\u00e1n azon kezdt\u00fcnk gondolkodni, hogy mik\u00e9nt tudn\u00e1nk hat\u00e9konyabban \u00e1tadni a feladatokat a PHP-folyamatoknak. Amikor egy feladat \u00e9rkezik, az alkalmaz\u00e1sszervernek ki kell v\u00e1lasztania egy szabad munk\u00e1st annak v\u00e9grehajt\u00e1s\u00e1ra. Ha egy munk\u00e1s\/folyamat hib\u00e1val z\u00e1rult le vagy \"meghalt\", akkor elt\u00e1vol\u00edtjuk, \u00e9s helyette \u00fajat hozunk l\u00e9tre. Ha a munk\u00e1s\/folyamat sikeresen befejezte, akkor visszahelyezz\u00fck azt a szabad munk\u00e1sok k\u00f6z\u00e9, akik feladatok v\u00e9grehajt\u00e1s\u00e1ra rendelkez\u00e9sre \u00e1llnak.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: A PHP nem arra k\u00e9sz\u00fclt, hogy meghaljon, vagy a Golang siet a seg\u00edts\u00e9g\u00e9re\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAz akt\u00edv munk\u00e1sok medenc\u00e9j\u00e9nek t\u00e1rol\u00e1s\u00e1ra a k\u00f6vetkez\u0151t haszn\u00e1ltuk<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> pufferelt csatorna<\/a><\/noindex>, a v\u00e1ratlanul \"meghalt\" munk\u00e1sok elt\u00e1vol\u00edt\u00e1s\u00e1ra hibak\u00f6vet\u00e9si \u00e9s \u00e1llapotfigyel\u0151 mechanizmust adtunk hozz\u00e1.<\/p>\n<p>Ennek eredm\u00e9nyek\u00e9nt egy m\u0171k\u00f6d\u0151 PHP-szervert kaptunk, amely k\u00e9pes b\u00e1rmilyen bin\u00e1ris form\u00e1tum\u00fa k\u00e9r\u00e9s feldolgoz\u00e1s\u00e1ra.<\/p>\n<p>Ahhoz, hogy az alkalmaz\u00e1sunk webkiszolg\u00e1l\u00f3k\u00e9nt m\u0171k\u00f6dj\u00f6n, egy megb\u00edzhat\u00f3 PHP-szabv\u00e1nyt kellett v\u00e1lasztanunk b\u00e1rmilyen bej\u00f6v\u0151 HTTP-k\u00e9r\u00e9s megjelen\u00edt\u00e9s\u00e9re. Eset\u00fcnkben egyszer\u0171en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">\u00e1talak\u00edtjuk<\/a><\/noindex> a Go-beli net\/http k\u00e9r\u00e9s\u00e9t<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>form\u00e1tumba, hogy az kompatibilis legyen a ma el\u00e9rhet\u0151 legt\u00f6bb PHP-keretrendszerrel.<\/p>\n<p>Mivel a PSR-7 v\u00e1ltozatlannak sz\u00e1m\u00edt (valaki azt mondan\u00e1, hogy technikailag nem \u00edgy van), a fejleszt\u0151knek olyan alkalmaz\u00e1sokat kell \u00edrniuk, amelyek alapvet\u0151en nem kezelik a k\u00e9r\u00e9st glob\u00e1lis entit\u00e1sk\u00e9nt. Ez remek\u00fcl illeszkedik a hossz\u00fa \u00e9let\u0171 PHP-folyamatok koncepci\u00f3j\u00e1hoz. Az utols\u00f3 megval\u00f3s\u00edt\u00e1sunk, amely m\u00e9g nem kapott nevet, \u00edgy n\u00e9zett ki:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: A PHP nem arra k\u00e9sz\u00fclt, hogy meghaljon, vagy a Golang siet a seg\u00edts\u00e9g\u00e9re\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Bemutatjuk a RoadRunner-t \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> nagy teljes\u00edtm\u00e9ny\u0171 PHP-alkalmaz\u00e1s-kiszolg\u00e1l\u00f3<\/a><\/noindex><\/h3>\n<p>\nEls\u0151 tesztfeladatunk egy API-h\u00e1tt\u00e9r volt, amelyen id\u0151nk\u00e9nt kisz\u00e1m\u00edthatatlanul felmer\u00fcltek a k\u00e9r\u00e9skiugr\u00e1sok (sokkal gyakrabban, mint \u00e1ltal\u00e1ban). B\u00e1r az nginx t\u00f6bbs\u00e9g\u00e9ben elegend\u0151 volt, rendszeresen szembes\u00fclt\u00fcnk 502-es hib\u00e1val, mert nem tudtuk el\u00e9g gyorsan kiegyens\u00falyozni a rendszert a v\u00e1rhat\u00f3 terhel\u00e9sn\u00f6veked\u00e9shez.<\/p>\n<p>Ennek a megold\u00e1snak a helyettes\u00edt\u00e9s\u00e9re 2018 elej\u00e9n telep\u00edtett\u00fck az els\u0151 PHP\/Go alkalmaz\u00e1sszerver\u00fcnket. Azonnal elk\u00e9peszt\u0151 hat\u00e1st tapasztaltunk! Nemcsak hogy teljesen megszabadultunk a 502-es hib\u00e1t\u00f3l, hanem a szerverek sz\u00e1m\u00e1t is egyharmad\u00e1val cs\u00f6kkentett\u00fck, rengeteg p\u00e9nzt \u00e9s f\u00e1jdalomcsillap\u00edt\u00f3t sp\u00f3rolva meg a m\u00e9rn\u00f6k\u00f6k \u00e9s term\u00e9kmenedzserek sz\u00e1m\u00e1ra.<\/p>\n<p>\u00c9v k\u00f6zep\u00e9re tov\u00e1bbfejlesztett\u00fck megold\u00e1sunkat, k\u00f6zz\u00e9tett\u00fck a GitHub-on MIT licenccel \u00e9s elnevezt\u00fck <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, ezzel hangs\u00falyozva hihetetlen sebess\u00e9g\u00e9t \u00e9s hat\u00e9konys\u00e1g\u00e1t.<\/p>\n<h3>Hogyan jav\u00edthatja a RoadRunner a fejleszt\u00e9si stack-et<\/h3>\n<p>\nAlkalmaz\u00e1s<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> lehet\u0151v\u00e9 tette sz\u00e1munkra, hogy a Middleware net\/http-t haszn\u00e1ljuk a Go oldal\u00e1n, hogy a JWT-ellen\u0151rz\u00e9st m\u00e9g azel\u0151tt elv\u00e9gezz\u00fck, hogy a k\u00e9r\u00e9s PHP-ba \u00e9rkezik, valamint WebSocketeket kezelj\u00fcnk \u00e9s glob\u00e1lisan aggreg\u00e1ljuk az \u00e1llapotokat a Prometheusban. <\/p>\n<p>A be\u00e9p\u00edtett RPC lehet\u0151v\u00e9 teszi, hogy b\u00e1rmely Go k\u00f6nyvt\u00e1r API-j\u00e1t PHP sz\u00e1m\u00e1ra el\u00e9rhet\u0151v\u00e9 tegy\u00fck an\u00e9lk\u00fcl, hogy wrapper-extensi\u00f3kat kellene \u00edrni. Ami m\u00e9g fontosabb, a RoadRunner seg\u00edts\u00e9g\u00e9vel \u00faj, HTTP-t\u00f3l elt\u00e9r\u0151 szervereket telep\u00edthet\u00fcnk. P\u00e9ldak\u00e9nt eml\u00edthetj\u00fck a PHP feldolgoz\u00f3k elind\u00edt\u00e1s\u00e1t<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, megb\u00edzhat\u00f3 \u00fczenetk\u00f6zvet\u00edt\u0151 elemz\u0151k l\u00e9trehoz\u00e1s\u00e1t, \u00e9s m\u00e9g<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> alkalmaz\u00e1sainkhoz val\u00f3 hozz\u00e1ad\u00e1s\u00e1t.<\/p>\n<p>A PHP \u00e9s Go k\u00f6z\u00f6ss\u00e9gekkel egy\u00fcttm\u0171k\u00f6dve n\u00f6velt\u00fck a megold\u00e1s stabilit\u00e1s\u00e1t, bizonyos tesztek sor\u00e1n a teljes\u00edtm\u00e9nyt ak\u00e1r 40-szer is fokozva, tov\u00e1bbfejlesztett\u00fck a hibakeres\u00e9si eszk\u00f6z\u00f6ket, integr\u00e1ltuk a Symfony keretrendszert, \u00e9s t\u00e1mogat\u00e1st adtunk a HTTPS, HTTP\/2, pluginek \u00e9s PSR-17 sz\u00e1m\u00e1ra.<\/p>\n<h3>Z\u00e1r\u00e1s<\/h3>\n<p>\nN\u00e9h\u00e1nyan m\u00e9g mindig a PHP-t egy lass\u00fa, neh\u00e9zkes nyelvk\u00e9nt l\u00e1tj\u00e1k, amely csak a WordPress pluginok \u00edr\u00e1s\u00e1ra alkalmas. Ezek az emberek ak\u00e1r azt is mondhatj\u00e1k, hogy a PHP-nak van egy ilyen korl\u00e1tja: amikor egy alkalmaz\u00e1s el\u00e9g naggy\u00e1 v\u00e1lik, '\u00e9rettebb' nyelvet kell v\u00e1lasztani, \u00e9s \u00fajra kell \u00edrni az \u00e9vek sor\u00e1n felhalmoz\u00f3dott k\u00f3dalapot.<\/p>\n<p>Mindezekre azt szeretn\u00e9nk mondani: gondolj\u00e1k \u00e1t \u00fajra. \u00dagy \u00e9rezz\u00fck, hogy csakis ti \u00e1ll\u00edtotok korl\u00e1tokat a PHP sz\u00e1m\u00e1ra. Az eg\u00e9sz \u00e9letedet elt\u00f6ltheted azzal, hogy egyik nyelvr\u0151l a m\u00e1sikra v\u00e1ltogatsz, pr\u00f3b\u00e1lva megtal\u00e1lni a t\u00f6k\u00e9letes kombin\u00e1ci\u00f3t az ig\u00e9nyeiddel, vagy elkezdheted a nyelveket eszk\u00f6zk\u00e9nt kezelni. A PHP-hoz hasonl\u00f3 nyelv l\u00e1tsz\u00f3lagos h\u00e1tr\u00e1nyai val\u00f3j\u00e1ban a siker\u00e9nek okai is lehetnek. Ha pedig egy m\u00e1sik nyelvvel, p\u00e9ld\u00e1ul a Goval kombin\u00e1lod, olyan sokkal er\u0151sebb term\u00e9keket hozhatsz l\u00e9tre, mint ha csak egyetlen nyelvet haszn\u00e1ln\u00e1l.<\/p>\n<p>A Go \u00e9s PHP kombin\u00e1ci\u00f3j\u00e1val dolgozva azt mondhatjuk, hogy beleszerett\u00fcnk. Nem tervezz\u00fck, hogy fel\u00e1ldozzuk az egyiket a m\u00e1sik\u00e9rt \u2014 ellenkez\u0151leg, keresni fogunk m\u00f3dokat, hogy m\u00e9g t\u00f6bb hasznot h\u00fazzunk ebb\u0151l a p\u00e1rhuzamos stackb\u0151l.<\/p>\n<p><i>UPD: \u00fcdv\u00f6z\u00f6lj\u00fck a RoadRunner alkot\u00f3j\u00e1t \u00e9s az eredeti cikk t\u00e1rsszerz\u0151j\u00e9t \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/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: A PHP nem az\u00e9rt k\u00e9sz\u00fclt, hogy meghaljon, vagy a Golang siet a seg\u00edts\u00e9gre | ProHoster","description":"Hell\u00f3, Habr!","canonical_url":"https:\/\/prohoster.info\/hu\/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":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}