ProHoster > Blog > Pulega > RoadRunner: PHP e le o fausia e oti, poʻo Golang e laveai
RoadRunner: PHP e le o fausia e oti, poʻo Golang e laveai
Talofa, Habr! Matou te toaaga i Badoo galue ile fa'atinoga PHP, talu ai o loʻo i ai se matou faiga tele i lenei gagana ma o le mataupu o le faʻatinoga o se mataupu o le faʻasaoina o tupe. E sili atu ma le sefulu tausaga talu ai, na matou fatuina ai le PHP-FPM mo lenei mea, lea i le taimi muamua o se seti o patches mo PHP, ma mulimuli ane avea ma vaega o le tufatufaina aloaia.
I tausaga talu ai nei, ua faʻateleina le alualu i luma o le PHP: ua faʻaleleia le faʻaputu lapisi, ua faʻateleina le maualuga o le mautu - i aso nei e mafai ona e tusia ni daemons ma tusitusiga umi i le PHP e aunoa ma se faʻafitauli. O lenei mea na faʻatagaina ai le Spiral Scout e alu atili: RoadRunner, e le pei o PHP-FPM, e le faʻamamāina le manatua i le va o talosaga, lea e maua ai faʻamanuiaga faʻaopoopo faʻatinoga (e ui o lenei auala e faʻalavelaveina ai le atinaʻe). O lo'o matou fa'ata'ita'i i lenei mea faigaluega, ae leai ni a matou fa'ai'uga e fa'asoa. Ina ia faʻafiafia atili le faʻatali mo i latou, O loʻo matou lolomiina se faʻaliliuga o le RoadRunner faʻasalalauga mai le Spiral Scout.
O le auala mai le tusiga e latalata ia i matou: pe a foia o matou faafitauli, matou te masani foi ona faʻaaogaina se tuʻufaʻatasiga o le PHP ma le Go, maua le aoga o gagana uma e lua ma aua le tuʻuina atu le tasi e fiafia i le isi.
Fiafia!
I le sefulu tausaga talu ai, ua matou fatuina talosaga mo kamupani mai le lisi Fortune 500, ma mo pisinisi e le sili atu i le 500 tagata fa'aoga. I le taimi atoa nei, o matou inisinia na atiina ae le pito i tua i le PHP. Ae i le lua tausaga talu ai, o se mea na faia se aafiaga tele e le gata i le faatinoga oa tatou oloa, ae faapea foi i luga o latou scalability - na matou faʻafeiloaʻi Golang (Go) i la matou faʻaputuga tekonolosi.
Toeitiiti lava o le taimi lava lena, na matou iloa ai o Go na faʻatagaina i matou e fausia ni tusi tetele e oʻo atu i le 40x vave faʻatinoga. Faatasi ai ma lea mea, na mafai ai ona matou faʻalauteleina oloa o loʻo iai ua tusia i le PHP, faʻaleleia atili e ala i le tuʻufaʻatasia o tulaga lelei o gagana e lua.
Matou te taʻu atu ia te oe pe faʻafefea ona fesoasoani le tuʻufaʻatasiga o Go ma PHP e foia faʻafitauli moni o atinaʻe ma pe faʻafefea ona avea ma meafaigaluega mo i matou e mafai ona faʻaumatia nisi o faʻafitauli e fesoʻotaʻi ma PHP mate fa'ata'ita'iga.
Lau Siosiomaga Atina'e PHP Aso Ta'itasi
Ae tatou te le'i talanoa pe fa'afefea ona e fa'aogaina le Alu e toe fa'aola le fa'ata'ita'iga mate a PHP, se'i o tatou va'ai i lau si'osi'omaga fa'atupuina PHP masani.
I le tele o tulaga, e te faʻaogaina le talosaga e faʻaaoga ai se tuʻufaʻatasiga o le nginx web server ma le PHP-FPM server. O le mea muamua e tu'uina atu faila fa'amau ma toe fa'asa'o talosaga fa'apitoa ile PHP-FPM, ma PHP-FPM lava ia na te fa'atinoina le code PHP. Masalo o loʻo e faʻaaogaina se tuʻufaʻatasiga le lauiloa mai Apache ma mod_php. Ae e ui ina fai si ese teisi, ae e tutusa lava mataupu faavae.
Se'i o tatou va'ai pe fa'apefea ona fa'atino e PHP-FPM le fa'ailoga tusi talosaga. A oʻo mai se talosaga, PHP-FPM amata le tamaititi PHP faagasologa ma pasia faʻamatalaga talosaga o se vaega o lona setete (_GET, _POST, _SERVER, ma isi).
E le mafai ona suia le setete i le taimi o le faʻatinoina o le PHP script, o lea e naʻo le tasi le auala e maua ai se seti fou o faʻamatalaga faʻapipiʻi: e ala i le faʻamamaina o le manatua o le faagasologa ma toe faʻafouina.
O lenei faʻataʻitaʻiga faʻataʻitaʻiga e tele mea lelei. E te le tau popole tele e uiga i le taumafaina manatua, o faiga uma e matua vavae ese, ma afai e mate se tasi, o le a otometi lava ona toe fatuina e aunoa ma le aafia ai o isi vaega. Ae o lenei faiga e iai foʻi faʻaletonu e aliali mai pe a taumafai e faʻalautele le talosaga.
Le lelei ma le le atoatoa o se siosiomaga PHP masani
Afai o loʻo e auai i le atinaʻeina faʻapolofesa ile PHP, ona e iloa lea o le mea e amata ai se galuega fou - e ala i le filifilia o se faʻavae. E aofia ai faletusi mo tui fa'alagolago, ORM, fa'aliliuga ma fa'ata'ita'iga. Ma o le mea moni, o mea uma e faʻaoga e mafai ona tuʻuina i totonu o se mea e tasi (Symfony / HttpFoundation poʻo PSR-7). E manaia fa'ava'a!
Ae o mea uma e iai lona tau. I soʻo se atinaʻe-tulaga faʻavae, e faʻagasolo ai se talosaga faigofie a le tagata faʻaoga poʻo le faʻaogaina o se faʻamaumauga, e tatau ona e utaina a itiiti ifo ma le tele o faila, fatuina le tele o vasega ma faʻavasega le tele o faʻasalalauga. Ae o le mea sili ona leaga o le maeʻa lea o galuega taʻitasi e te manaʻomia e toe setiina mea uma ma toe amata: o tulafono uma na e amataina e le aoga, faatasi ai ma lana fesoasoani e te le toe faia se isi talosaga. Ta'u atu lenei mea i so'o se tagata fai polokalame e tusitusi i se isi lava gagana, ma o le a e va'ai atu i ona foliga le fememea'i.
PHP inisinia ua faʻaaluina le tele o tausaga e suʻe ai auala e foia ai lenei faʻafitauli, e faʻaaoga ai metotia faʻaogaina paie, microframeworks, faletusi optimized, caches, ma isi. Ae i le faaiuga, e tatau lava ona e toe setiina le talosaga atoa ma toe amata, toe fai. (Faamatalaga a le Faaliliu: o lenei faafitauli o le a foia se vaega i le oo mai o muai faʻatulagaina ile PHP 7.4)
E mafai e PHP ma Go ona ola i le sili atu ma le tasi le talosaga?
E mafai ona tusia fa'amaumauga PHP e umi atu nai lo nai minute (e o'o i itula po'o aso): mo se fa'ata'ita'iga, cron tasks, CSV parsers, queue busters. Latou te galulue uma e tusa ai ma le tulaga e tasi: latou te toe maua se galuega, faʻatino, ma faʻatali mo le isi. O le code e nofo i le manatua, faʻasaoina milliseconds taua e pei o le tele o laasaga faaopoopo e manaʻomia e utaina ai le faʻavae ma le faʻaoga.
Ae o le atinaʻeina o tusitusiga umi e le faigofie. So'o se mea sese e fa'aumatia atoa ai le fa'agasologa, o le su'esu'eina o le galo e te fa'avalevalea, ma e le toe mafai ona e fa'aogaina le F5 debugging.
Ua faʻaleleia le tulaga i le faʻasaʻoina o le PHP 7: ua faʻaalia se faʻaputu lapisi faʻalagolago, ua sili atu ona faigofie le taulimaina o mea sese, ma ua puipuia nei faʻaopoopoga o fatu mai le gaʻo. E moni, e manaʻomia pea e inisinia ona faʻaeteete i le manatuaina ma nofouta i mataupu a le setete i totonu o le code (pe i ai se gagana e le tatau ai ona tatou popole i nei mea?). Ae ui i lea, i le PHP 7, e itiiti ni mea e ofo ai o loʻo faʻatali mai ia i tatou.
E mafai ona ave le faʻataʻitaʻiga o le galue ma faʻamaumauga PHP umi, faʻafetaui i galuega e sili atu le taua e pei o le faʻaogaina o talosaga HTTP, ma faʻaumatia ai le manaʻoga e utaina mea uma mai le sasa mo talosaga taʻitasi?
Ina ia foia lenei faafitauli, matou te manaʻomia muamua le faʻatinoina o se talosaga a le server e mafai ona talia talosaga HTTP ma tuʻuina atu i latou taʻitasi i le tagata faigaluega PHP e aunoa ma le fasiotia i taimi uma.
Na matou iloa e mafai ona matou tusia se upega tafaʻilagi i le PHP mama (PHP-PM) poʻo le faʻaogaina o le C extension (Swoole). Ma e ui lava o metotia taʻitasi e iai ona lava aoga, o filifiliga uma e lua e le fetaui ma i matou - matou te manaʻo i se mea e sili atu. Matou te manaʻomia mea e sili atu nai lo na o se 'upega tafaʻilagi - matou te faʻamoemoe e maua se fofo e mafai ona laveaʻiina i matou mai faʻafitauli e fesoʻotaʻi ma le "amataga faigata" i le PHP, lea i le taimi lava e tasi e mafai ona faigofie ona fetuunai ma faʻalauteleina mo faʻamatalaga patino. O lona uiga, matou te manaʻomia se 'auʻaunaga talosaga.
E mafai e Go se fesoasoani i lenei mea? Na matou iloa e mafai ona o le gagana e tu'ufa'atasia tusi talosaga i totonu o binaries tasi; o lo'o fa'alavalava; fa'aogaina lana lava, fa'alelei, fa'ata'ita'iga fa'ata'ita'iga (concurrency) ma le faletusi mo le galulue fa'atasi ma HTTP; ma mulimuli ane, o le a avanoa mo i tatou le faitau afe o faletusi ma tuʻufaʻatasiga tatala.
Faigata o le tu'ufa'atasia o gagana fa'apolokalame se lua
O le laasaga muamua o le fuafuaina lea pe fa'afefea ona feso'ota'i se lua pe sili atu fo'i talosaga le tasi i le isi.
Mo se faʻataʻitaʻiga, faʻaaogaina faletusi matagofie Alex Palaestras e mafai ona faʻatinoina le faʻasoaina o mafaufauga i le va o le PHP ma le Go (e tutusa ma mod_php i Apache). Ae o lenei faletusi o loʻo i ai vaega e faʻatapulaʻaina lona faʻaogaina mo le foia o tatou faʻafitauli.
Na matou filifili e faʻaoga se isi, sili atu ona masani, auala: e fausia ai fegalegaleaiga i le va o faiga e ala i sockets / pipelines. O lenei faiga ua faʻamaonia lona faʻamaoni i le tele o tausaga ua tuanaʻi ma ua faʻalelei lelei i le tulaga faʻaogaina o le polokalama.
I le amataga, na matou fatuina se faiga faʻavae faigofie mo le fesuiaiga o faʻamatalaga i le va o gaioiga ma le taulimaina o mea sese. I lona foliga faigofie, o lenei ituaiga o protocol e tutusa ma manoa upega с lapo'a fa'amau fa'aulu (i la matou tulaga 17 bytes), o loʻo i ai faʻamatalaga e uiga i le ituaiga o afifi, lona tele ma se masini binary e siaki ai le faʻamaoni o faʻamaumauga.
Na foliga mai ia i matou e le lava le tasi tulafono - o lea na matou faʻaopoopoina ai le mafai ona valaʻau Alu sa'o auaunaga net/rpc mai PHP. O lenei mea mulimuli ane na fesoasoani tele ia i matou i le atinaʻe, aua e faigofie ona matou tuʻufaʻatasia faletusi Go i PHP talosaga. O le taunuuga o lenei galuega e mafai ona vaʻaia, mo se faʻataʻitaʻiga, i totonu o le matou isi oloa tatala-source Goridge.
Fa'asoa galuega i le tele o tagata faigaluega PHP
Ina ua maeʻa le faʻatinoina o le faʻaogaina o fesoʻotaʻiga, na amata ona matou mafaufau pe faʻafefea ona sili atu ona lelei le tuʻuina atu o galuega i faiga PHP. A oʻo mai se galuega, e tatau i le 'auʻaunaga talosaga ona filifili se tagata faigaluega saoloto e faʻamaeʻa. Afai e faʻamutaina se tagata faigaluega / faʻagasologa i se mea sese pe "oti," matou te faʻaumatia ma faia se mea fou e sui ai. Ma afai ua maeʻa manuia le tagata faigaluega / faʻagasologa, matou te toe faʻafoʻi atu i le vaitaele o tagata faigaluega avanoa e faʻatino galuega.
Ina ia teuina se vaitaele o tagata galulue malosi na matou faʻaaogaina ala fa'afefe, ina ia aveese faʻafuaseʻi "oti" tagata faigaluega mai le vaitaele, matou te faʻaopoopoina se masini mo le siakiina o mea sese ma setete o tagata faigaluega.
O le i'uga, na matou mauaina se server PHP galue e mafai ona fa'agaoioia so'o se talosaga e tu'uina atu i le faiga fa'alua.
Ina ia mafai ona faʻaogaina le matou talosaga e avea o se upega tafaʻilagi, e tatau ona matou filifilia se tulaga faʻalagolago PHP e fai ma sui o soʻo se talosaga HTTP ulufale mai. I lo tatou tulaga tatou na o liua net/http talosaga mai Alu i le faatulagaga PSR-7ina ia fetaui ma le tele o faʻatulagaga PHP o loʻo maua i aso nei.
Talu ai ona o le PSR-7 e manatu e le mafai ona suia (o nisi e fai mai faʻapitoa e leai), e tatau i tagata atiaʻe ona tusi tusi talosaga e le faʻatatauina le talosaga o se faʻalapotopotoga faʻavaomalo. E fetaui lelei lea ma le manatu o faiga PHP umi. O la matou faʻatinoga mulimuli, lea e leʻi taʻua, e pei o lenei:
O la matou suʻega muamua o le API backend, lea e masani ona oʻo i le faʻalavelave faʻafuaseʻi o talosaga (sili atu tele nai lo le masani). E ui lava o le nginx na lava i le tele o tulaga, matou te masani ona feagai ma 502 mea sese ona e le mafai ona matou faapaleni vave le faiga mo le faʻatupulaia o le uta.
Ina ia sui lenei fofo, na matou faʻaogaina le matou PHP / Go application server i le amataga o le 2018. Ma o le taimi lava lena na matou maua ai se aafiaga ofoofogia! E le gata na matou faʻaumatia atoa le 502 sese, ae na mafai foi ona matou faʻaitiitia le numera o sapalai i le lua vaetolu, faʻasaoina le tele o tupe ma ulu ulu mo inisinia ma pule o oloa.
E oʻo atu i le ogatotonu o le tausaga, ua maeʻa le matou fofo, lomia i luga ole GitHub i lalo ole laisene MIT, ma taʻua. Auala, ma fa'amamafaina ai lona saoasaoa tele ma le lelei.
Fa'afefea ona Fa'aleleia e RoadRunner lau Atina'e Fa'aputu
Talosaga Auala faʻatagaina matou e faʻaoga Middleware net / http i luga o le Go itu e faʻamaonia ai le JWT aʻo leʻi oʻo i le PHP le talosaga, faʻapea foʻi ma le taulimaina o WebSockets ma le faʻapotopotoga o le lalolagi atoa i Prometheus.
Faʻafetai i le RPC fausia, e mafai ona e tatalaina le API o soʻo se faletusi Go mo PHP e aunoa ma le tusiaina o afifi faʻaopoopoga. Ae sili atu le taua, RoadRunner e mafai ona faʻaogaina e faʻapipiʻi ai ni sapalai fou e le o ni HTTP. O faʻataʻitaʻiga e aofia ai le faʻalauiloaina o tagata faʻatautaia ile PHP AWS Lambda, faia fa'alagolago i laina fa'atosina ma fa'aopoopo gRPC i a matou talosaga.
Faatasi ai ma le fesoasoani a le PHP ma le Go community, ua matou faʻalauteleina le mautu o le fofo, faʻateleina le faʻatinoga o talosaga e oʻo atu i le 40 taimi i nisi o suʻega, faʻaleleia meafaigaluega faʻapipiʻi, faʻatinoina le tuʻufaʻatasia ma le Symfony framework, ma faʻaopoopo le lagolago mo HTTPS, HTTP / 2, plugini, ma PSR-17.
iʻuga
O nisi tagata o loʻo maua pea i le vaʻaiga tuai o le PHP o se gagana faʻagesegese, faʻalavelave naʻo le lelei mo le tusiaina o WordPress plugins. Atonu e fai mai nei tagata o le PHP e iai se tapulaʻa: pe a lava le tele o le talosaga, e tatau ona e filifilia se gagana sili atu "matua" ma toe tusi le faʻavae code lea na faʻaputuina i le tele o tausaga.
I nei mea uma ou te fia tali atu: toe mafaufau. Matou te talitonu e na'o oe e mafai ona setiina so'o se tapula'a mo PHP. E mafai ona e faʻaalu lou olaga atoa e osooso mai le tasi gagana i le isi, taumafai e suʻe le fetaui lelei mo ou manaʻoga, pe amata ona e mafaufau i gagana o ni meafaigaluega. O fa'aletonu o lo'o va'aia o se gagana e pei o le PHP atonu o le mafua'aga tonu lea o lona manuia. Ma afai e te tu'ufa'atasia ma se isi gagana e pei o le Go, e mafai ona e faia ni oloa e sili atu le mamana nai lo le fa'atapula'aina i le na'o le tasi le gagana.
O le galulue faatasi ma le Go ma le PHP, e mafai ona matou fai atu matou te alolofa ia i latou. Matou te le o fuafua e ositaulaga le tasi mo le isi, ae ia vaʻavaʻai mo ni auala e maua atili ai le tau mai lenei faʻaputu lua.
UPD: Matou te faʻafeiloaia le na faia le RoadRunner ma le tusitala o le uluaʻi tusiga - Lachesis