RoadRunner: A naghị ewu PHP ka ọ nwụọ, ma ọ bụ Golang na nnapụta

RoadRunner: A naghị ewu PHP ka ọ nwụọ, ma ọ bụ Golang na nnapụta

Hey Habr! Anyị na-arụsi ọrụ ike na Badoo na-arụ ọrụ na PHP, ebe ọ bụ na anyị nwere nnukwu usoro n'asụsụ a na okwu arụmọrụ bụ okwu ịchekwa ego. Ihe karịrị afọ iri gara aga, anyị kere PHP-FPM maka nke a, nke na mbụ bụ patches maka PHP, ma mesịa banye na nkesa gọọmentị.

N'ime afọ ndị na-adịbeghị anya, PHP enweela ọganihu dị ukwuu: onye na-ekpofu ihe na-eme ka ọ dịkwuo mma, ọkwa nke nkwụsi ike abawanyela - taa ị nwere ike dee daemons na ederede ogologo oge na PHP n'enweghị nsogbu ọ bụla. Nke a kwere ka Spiral Scout gaa n'ihu: RoadRunner, n'adịghị ka PHP-FPM, anaghị ehichapụ ebe nchekwa n'etiti arịrịọ, nke na-enye uru arụmọrụ ọzọ (ọ bụ ezie na usoro a na-eme ka usoro mmepe ahụ sie ike). Anyị na-eji ngwa a na-anwale ugbu a, mana anyị enweghị nsonaazụ ọ bụla anyị ga-ekekọrịta. Iji mee ka ichere ha dịkwuo ụtọ, anyị na-ebipụta nsụgharị nke ọkwa RoadRunner site na Spiral Scout.

Usoro sitere na isiokwu ahụ dị anyị nso: mgbe anyị na-edozi nsogbu anyị, anyị na-ejikarị ọtụtụ PHP na Go, na-enweta uru nke asụsụ abụọ ahụ ma ghara ịhapụ otu maka ibe ya.

-Enwe!

N'ime afọ iri gara aga, anyị ekepụtala ngwa maka ụlọ ọrụ site na listi ahụ 500 Fortune, yana maka azụmaahịa nwere ndị na-ege ntị na-erughị ndị ọrụ 500. N'oge a niile, ndị injinia anyị na-etolite azụ azụ tumadi na PHP. Ma afọ abụọ gara aga, ihe nwere mmetụta dị ukwuu ọ bụghị nanị na arụmọrụ nke ngwaahịa anyị, kamakwa na scalability ha - anyị webatara Golang (Go) n'ime nchịkọta teknụzụ anyị.

Ihe fọrọ nke nta ka ọ bụrụ ozugbo, anyị chọpụtara na Go kwere ka anyị wuo ngwa buru ibu yana nkwalite arụmọrụ ruru 40x. Site na ya, anyị nwere ike ịgbatị ngwaahịa PHP anyị dị ugbu a, meziwanye ha site na ijikọta uru nke asụsụ abụọ ahụ.

Anyị ga-agwa gị otu njikọ nke Go na PHP na-enyere aka dozie nsogbu mmepe n'ezie yana otu o siri ghọọ ngwá ọrụ maka anyị nwere ike iwepụ ụfọdụ nsogbu ndị metụtara ya. PHP ụdị anwụ anwụ.

gburugburu mmepe PHP gị kwa ụbọchị

Tupu anyị ekwu maka otu Go nwere ike isi weta ụdị PHP na-anwụ anwụ na ndụ, ka anyị lelee gburugburu mmepe PHP ndabara gị.

N'ọtụtụ oge, ị na-eji nchikota sava weebụ nginx na nkesa PHP-FPM na-eme ngwa gị. Nke mbụ na-eje ozi faịlụ static ma na-ebugharị arịrịọ kpọmkwem na PHP-FPM, ebe PHP-FPM n'onwe ya na-eme koodu PHP. Ị nwere ike na-eji nchikota Apache na mod_php na-ewu ewu. Ma n'agbanyeghị na ọ na-arụ ọrụ dịtụ iche, ụkpụrụ bụ otu.

Ka anyị lee ka PHP-FPM si eme koodu ngwa. Mgbe arịrịọ batara, PHP-FPM na-ebido usoro ụmụaka PHP wee nyefee nkọwa nke arịrịọ ahụ dịka akụkụ nke steeti ya (_GET, _POST, _SERVER, wdg).

Steeti enweghị ike ịgbanwe n'oge a na-eme ihe ederede PHP, yabụ naanị ụzọ ị ga-esi nweta data ntinye ọhụrụ bụ site na ikpochapụ ebe nchekwa usoro na ibido ya ọzọ.

Ụdị ogbugbu a nwere ọtụtụ uru. Ịkwesighi ichegbu onwe gị banyere oriri ebe nchekwa, usoro niile dịpụrụ adịpụ kpamkpam, ma ọ bụrụ na otu n'ime ha "anwụ", a ga-emegharị ya na-akpaghị aka na ọ gaghị emetụta usoro ndị ọzọ. Mana ụzọ a nwekwara ọghọm ndị na-apụta mgbe ị na-agbalị ịbawanye ngwa ahụ.

Ọdịmma na adịghị arụ ọrụ nke gburugburu PHP mgbe niile

Ọ bụrụ na ị bụ ọkachamara PHP onye nrụpụta, mgbe ahụ ị maara ebe ị ga-amalite ọrụ ọhụrụ - na nhọrọ nke usoro. Ọ nwere ọba akwụkwọ ịgba ọgwụ dabere, ORM, ntụgharị na ndebiri. Ma, n'ezie, enwere ike itinye ntinye onye ọrụ niile nke ọma n'otu ihe (Symfony/HttpFoundation ma ọ bụ PSR-7). Frameworks dị mma!

Mana ihe niile nwere ọnụ ahịa ya. N'ime usoro ọkwa ụlọ ọrụ ọ bụla, iji hazie arịrịọ onye ọrụ dị mfe ma ọ bụ nweta nchekwa data, ị ga-ebu opekata mpe ọtụtụ faịlụ, mepụta ọtụtụ klaasị wee tụgharịa ọtụtụ nhazi. Mana ihe kachasị njọ bụ na mgbe ịmechara ọrụ ọ bụla, ị ga-achọ ịtọgharịa ihe niile wee malite ọzọ: koodu niile ị malitere na-abaghị uru, site n'enyemaka ya, ị gaghịzi edozi arịrịọ ọzọ. Gwa onye ọ bụla na-eme mmemme nke na-ede n'asụsụ ọzọ, ị ga-ahụkwa mgbagwoju anya n'ihu ya.

Ndị injinia PHP anọwo na-achọ ụzọ isi dozie nsogbu a ruo ọtụtụ afọ, na-eji teknụzụ ndị umengwụ na-ebu ibu, microframeworks, ọba akwụkwọ kachasị mma, cache, wdg. . (Nkọwapụta onye ntụgharị: a ga-edozi nsogbu a na ọbịbịa nke bute na PHP 7.4)

PHP nwere Go nwere ike ịlanarị ihe karịrị otu arịrịọ?

Ọ ga-ekwe omume ịde ederede PHP nke dị ogologo karịa nkeji ole na ole (ruo awa ma ọ bụ ụbọchị): dịka ọmụmaatụ, ọrụ cron, CSV parsers, queue breakers. Ha niile na-arụ ọrụ dị ka otu ihe atụ: ha na-eweghachi ọrụ, rụọ ya, na-eche nke ọzọ. Koodu ahụ na-ebi na ebe nchekwa oge niile, na-echekwa milliseconds dị oke ọnụ ahịa n'ihi na enwere ọtụtụ usoro ọzọ achọrọ iji buo usoro na ngwa.

Mana ịmepụta edemede dị ogologo oge adịghị mfe. Njehie ọ bụla na-egbu usoro ahụ kpamkpam, ịchọpụta nkwụsị ebe nchekwa na-ewe iwe, na nbibi F5 agaghịzi ekwe omume.

Ọnọdụ ahụ emeela ka ọ dịkwuo mma na ntọhapụ nke PHP 7: onye nchịkọta ihe mkpofu a pụrụ ịdabere na ya apụtawo, ọ dị mfe ijikwa njehie, na mgbakwunye kernel ugbu a bụ ihe akaebe. N'ezie, ndị injinia ka kwesịrị ịkpachara anya na ebe nchekwa ma mara banyere okwu steeti na koodu (ọ nwere asụsụ nwere ike ileghara ihe ndị a anya?). N'agbanyeghị nke ahụ, PHP 7 nwere ntakịrị ihe ịtụnanya na-echere anyị.

Ọ ga-ekwe omume iwere ihe atụ nke ịrụ ọrụ na ederede PHP dị ogologo, megharia ya na ọrụ ndị na-adịghị mkpa dị ka nhazi arịrịọ HTTP, wee si otú ahụ wepụ mkpa ọ dị iji arịrịọ ọ bụla buo ihe niile site na ọkọ?

Iji dozie nsogbu a, anyị kwesịrị ibu ụzọ mejuputa ngwa nkesa nke nwere ike ịnakwere arịrịọ HTTP wee bugharịa ha n'otu n'otu na onye ọrụ PHP na-egbughị ya oge ọ bụla.

Anyị maara na anyị nwere ike dee sava weebụ na PHP dị ọcha (PHP-PM) ma ọ bụ jiri ndọtị C (Swoole). Ma ọ bụ ezie na usoro ọ bụla nwere uru nke ya, nhọrọ abụọ ahụ adabaghị anyị - anyị chọrọ ihe ọzọ. Anyị chọrọ karịa sava weebụ - anyị tụrụ anya na anyị ga-enweta ihe ngwọta nke nwere ike ịzọpụta anyị na nsogbu ndị metụtara "mmalite siri ike" na PHP, nke n'otu oge ahụ nwere ike ịmegharị ngwa ngwa ma gbasaa maka ngwa ngwa. Ya bụ, anyị chọrọ ihe nkesa ngwa.

Enwere ike ịga nyere aka na nke a? Anyị maara na ọ nwere ike n'ihi na asụsụ na-achịkọta ngwa n'ime otu ọnụọgụ abụọ; ọ bụ cross-platform; na-eji usoro nhazi nke ya, mara mma nke ukwuu (concurrency) yana ọbá akwụkwọ maka ịrụ ọrụ na HTTP; na n'ikpeazụ, puku kwuru puku ụlọ akwụkwọ mepere emepe na njikọta ga-adịrị anyị.

Ihe isi ike nke ijikọta asụsụ mmemme abụọ

Nke mbụ, ọ dị mkpa iji chọpụta otú ngwa abụọ ma ọ bụ karịa ga-esi na-ekwurịta okwu na ibe ha.

Dịka ọmụmaatụ, iji ọmarịcha ụlọ akwụkwọ Alex Palaestras, ọ ga-ekwe omume ịkekọrịta ebe nchekwa n'etiti PHP na usoro Go (dị ka mod_php na Apache). Mana ọbá akwụkwọ a nwere atụmatụ na-amachi ojiji ya na-edozi nsogbu anyị.

Anyị kpebiri iji ụzọ dị iche, nke a na-ahụkarị: iji wuo mmekọrịta n'etiti usoro site na oghere / pipeline. Ụzọ a egosila na a pụrụ ịdabere na ya n'ime iri afọ gara aga ma emeziwanye ya nke ọma na ọkwa sistemụ arụmọrụ.

Iji malite, anyị mepụtara usoro ọnụọgụ abụọ dị mfe maka mgbanwe data n'etiti usoro na ijikwa njehie nnyefe. N'ụdị ya kachasị mfe, ụdị protocol a yiri netstring с nkụnye eji isi mee nha nha (n'ọnọdụ anyị 17 bytes), nke nwere ozi gbasara ụdị ngwugwu, nha ya na ihe nkpuchi ọnụọgụ abụọ iji lelee iguzosi ike n'ezi ihe nke data.

N'akụkụ PHP anyị ji mkpọ ọrụ, na n'akụkụ Go, ọbá akwụkwọ encoding / ọnụọgụ abụọ.

Ọ dị anyị ka otu protocol ezughi oke - anyị gbakwunyekwara ikike ịkpọ oku net/rpc na-aga ọrụ ozugbo site na PHP. Mgbe e mesịrị, nke a nyeere anyị aka nke ukwuu na mmepe, ebe anyị nwere ike mfe itinye Go ọba akwụkwọ na PHP ngwa. Enwere ike ịhụ nsonaazụ nke ọrụ a, dịka ọmụmaatụ, na ngwaahịa anyị ọzọ mepere emepe Goridge.

Na-ekesa ọrụ n'ofe ọtụtụ ndị ọrụ PHP

Mgbe emechara usoro mmekọrịta, anyị malitere iche echiche maka ụzọ kachasị mma isi nyefee ọrụ na usoro PHP. Mgbe ọrụ rutere, ihe nkesa ngwa ga-ahọrọ onye ọrụ nweere onwe ya ime ya. Ọ bụrụ na onye ọrụ / usoro na-apụ na njehie ma ọ bụ "anwụ", anyị na-ewepụ ya ma mepụta nke ọhụrụ iji dochie ya. Ma ọ bụrụ na onye ọrụ / usoro emechaala nke ọma, anyị na-eweghachi ya na ọdọ mmiri ndị ọrụ dịnụ iji rụọ ọrụ.

RoadRunner: A naghị ewu PHP ka ọ nwụọ, ma ọ bụ Golang na nnapụta

Iji chekwaa ọdọ mmiri nke ndị ọrụ na-arụsi ọrụ ike, anyị na-eji ọwa buffered, iji wepụ ndị ọrụ "nwụrụ anwụ" na-atụghị anya ya na ọdọ mmiri ahụ, anyị gbakwunyere usoro maka nsuso njehie na steeti ndị ọrụ.

N'ihi ya, anyị nwetara PHP nkesa na-arụ ọrụ nwere ike ịhazi arịrịọ ọ bụla ewepụtara na ụdị ọnụọgụ abụọ.

Ka ngwa anyị wee malite ịrụ ọrụ dị ka sava weebụ, anyị ga-ahọrọ ụkpụrụ PHP a pụrụ ịdabere na ya iji nọchite anya arịrịọ HTTP ọ bụla na-abata. N'ọnọdụ anyị, anyị naanị mgbanwe arịrịọ net/http site na gaa na usoro PSR-7nke mere na ọ dakọtara na ọtụtụ n'ime usoro PHP dị taa.

N'ihi na a na-ewere PSR-7 enweghị mgbanwe (ụfọdụ ga-ekwu na teknụzụ ọ bụghị), ndị mmepe ga-ederịrị ngwa na-anaghị anabata arịrịọ ahụ dị ka ụkpụrụ zuru ụwa ọnụ. Nke a dabara nke ọma na echiche nke usoro PHP dị ogologo ndụ. Nrụ ọrụ ikpeazụ anyị, nke a na-akpọbeghị aha, dị ka nke a:

RoadRunner: A naghị ewu PHP ka ọ nwụọ, ma ọ bụ Golang na nnapụta

Na-ewebata RoadRunner - ihe nkesa ngwa PHP dị elu

Ọrụ nnwale mbụ anyị bụ azụ azụ API, nke na-agbawa kwa oge na-atụghị anya ya (ọtụtụ mgbe karịa ka ọ na-adị). Ọ bụ ezie na nginx zuru ezu n'ọtụtụ ọnọdụ, anyị na-ezute njehie 502 mgbe niile n'ihi na anyị enweghị ike ịhazi usoro ahụ ngwa ngwa maka mmụba a na-atụ anya na ibu.

Iji dochie ngwọta a, anyị wepụrụ sava ngwa PHP/Go mbụ anyị na mbido 2018. Na ozugbo nwetara ịrịba mmetụta! Ọ bụghị naanị na anyị kpochapụrụ njehie 502 kpamkpam, ma anyị nwere ike belata ọnụ ọgụgụ nke sava site na ụzọ abụọ n'ụzọ atọ, na-echekwa ego buru ibu na ọgwụ isi ọwụwa maka ndị injinia na ndị na-ahụ maka ngwaahịa.

Ka ọ na-erule n'etiti afọ, anyị emeziwanyela azịza anyị, bipụta ya na GitHub n'okpuru ikike MIT wee kpọọ ya aha. Runzọ okporo ụzọ, si otú ahụ na-ekwusi ike ọsọ ya dị egwu na arụmọrụ ya.

Kedu ka RoadRunner nwere ike isi melite nchịkọta mmepe gị

Ngwa Runzọ okporo ụzọ kwere ka anyị jiri Middleware net / http na Go n'akụkụ iji mee nkwenye JWT tupu arịrịọ ahụ erute PHP, yana ijikwa WebSockets na mkpokọta steeti zuru ụwa ọnụ na Prometheus.

N'ihi RPC arụnyere n'ime ya, ị nwere ike imepe API nke ụlọ akwụkwọ ọ bụla Go maka PHP na-edeghị ihe mkpuchi ndọtị. Nke kachasị mkpa, na RoadRunner ị nwere ike ibuga sava ọhụrụ na-abụghị HTTP. Ọmụmatụ gụnyere ndị na-agba ọsọ na PHP Lambda AWS, na-emepụta ndị na-agbaji kwụ n'ahịrị a pụrụ ịdabere na ya, na ọbụna na-agbakwụnye gRPC na ngwa anyị.

Site n'enyemaka nke obodo PHP na Go, anyị kwalitere nkwụsi ike nke ngwọta ahụ, mụbaa arụmọrụ ngwa ruo ugboro 40 n'ime ule ụfọdụ, ngwá ọrụ debugging dị mma, ntinye aka na Symfony framework, na gbakwunyere nkwado maka HTTPS, HTTP / 2. plugins, na PSR-17.

nkwubi

Ụfọdụ ndị ka na-ejide n'echiche na-adịghị mma nke PHP dị ka asụsụ na-adịghị ngwa ngwa, nke na-adịghị mma na-adị mma maka ide plugins maka WordPress. Ndị a nwere ike ọbụna ịsị na PHP nwere oke dị otú ahụ: mgbe ngwa ahụ na-ebuwanye ibu, ị ga-ahọrọ asụsụ "tozuru okè" ma degharịa koodu ntọala agbakọtara ọtụtụ afọ.

Maka ihe niile a chọrọ m ịza: chee echiche ọzọ. Anyị kwenyere na naanị gị debere mmachi ọ bụla maka PHP. Ị nwere ike iji ndụ gị niile na-agbanwe site n'otu asụsụ gaa na nke ọzọ, na-agbalị ịchọta ihe dabara adaba maka mkpa gị, ma ọ bụ ị nwere ike ịmalite iche asụsụ dị ka ngwá ọrụ. Nkwarụ nke asụsụ dị ka PHP nwere ike bụrụ ihe kpatara oganihu ya. Ma ọ bụrụ na ị jikọtara ya na asụsụ ọzọ dị ka Go, mgbe ahụ ị ga-emepụta ngwaahịa dị ike karịa ma ọ bụrụ na ị nwere oke na iji otu asụsụ.

N'ịbụ ndị na-arụ ọrụ na ụyọkọ Go na PHP, anyị nwere ike ịsị na anyị hụrụ ha n'anya. Anyị anaghị eme atụmatụ ịchụ otu maka nke ọzọ - n'ụzọ megidere nke ahụ, anyị ga-achọ ụzọ anyị ga-esi nweta uru karịa site na nchịkọta abụọ a.

UPD: anyị na-anabata onye okike RoadRunner na onye na-ede akwụkwọ akụkọ mbụ - Lachesis

isi: www.habr.com

Tinye a comment