{"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\/sq\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP nuk \u00ebsht\u00eb krijuar p\u00ebr t\u00eb vdekur, ose Golang nxiton n\u00eb ndihm\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP nuk \u00ebsht\u00eb krijuar p\u00ebr t\u00eb vdekur, ose Golang nxiton n\u00eb ndihm\u00eb\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebrsh\u00ebndetje, Habr! Ne n\u00eb Badoo po punojm\u00eb aktivisht <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">n\u00eb p\u00ebrmir\u00ebsimin e performanc\u00ebs s\u00eb PHP<\/a><\/noindex>, pasi kemi nj\u00eb sistem t\u00eb madh n\u00eb k\u00ebt\u00eb gjuh\u00eb dhe \u00e7\u00ebshtja e performanc\u00ebs \u00ebsht\u00eb nj\u00eb \u00e7\u00ebshtje e kursimit t\u00eb parave. M\u00eb shum\u00eb se dhjet\u00eb vjet m\u00eb par\u00eb krijuam PHP-FPM, i cili n\u00eb fillim ishte nj\u00eb grup patch-e p\u00ebr PHP, e m\u00eb pas u b\u00eb pjes\u00eb e shp\u00ebrndarjes zyrtare.<\/p>\n<p>Gjat\u00eb viteve t\u00eb fundit, PHP ka avancuar shum\u00eb: grumbulluesi i plehrave \u00ebsht\u00eb p\u00ebrmir\u00ebsuar, niveli i stabilitetit \u00ebsht\u00eb rritur - sot n\u00eb PHP mund t\u00eb shkruhen leht\u00ebsisht demon\u00eb dhe skenar\u00eb afatgjat\u00eb. Kjo i ka dh\u00ebn\u00eb mund\u00ebsin\u00eb Spiral Scout t\u00eb shkoj\u00eb m\u00eb tej: RoadRunner, ndryshe nga PHP-FPM, nuk pastron memorjen mes k\u00ebrkesave, \u00e7ka ofron nj\u00eb p\u00ebrfitim t\u00eb shtuar n\u00eb performanc\u00eb (edhe pse ky qasje e nd complicon procesin e zhvillimit). Tani po eksperimentohemi me k\u00ebt\u00eb mjet, por ende nuk kemi rezultate q\u00eb mund t\u00eb ndajn\u00eb. Q\u00eb pritja t\u00eb jet\u00eb m\u00eb e k\u00ebndshme, <b>po publikojm\u00eb p\u00ebrkthimin e njoftimit t\u00eb RoadRunner nga Spiral Scout.<\/b><\/p>\n<p>Qasja nga artikulli na p\u00ebrshtatet: n\u00eb zgjidhjen e detyrave tona gjithashtu shpesh p\u00ebrdorim \u00e7iftin PHP dhe Go, duke p\u00ebrfituar nga t\u00eb dy gjuh\u00ebt dhe pa hequr dor\u00eb nga njera n\u00eb favor t\u00eb tjetr\u00ebs.<\/p>\n<p>G\u00ebzoni!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Gjat\u00eb dhjet\u00eb viteve t\u00eb fundit kemi krijuar aplikacione edhe p\u00ebr kompanit\u00eb nga lista <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, dhe p\u00ebr bizneset me nj\u00eb audienc\u00eb prej m\u00eb pak se 500 p\u00ebrdoruesish. Gjat\u00eb gjith\u00eb k\u00ebsaj kohe inxhinier\u00ebt tan\u00eb kan\u00eb zhvilluar backend kryesisht n\u00eb PHP. Por dy vjet m\u00eb par\u00eb di\u00e7ka ndodhi q\u00eb nd profoundly ndikoi jo vet\u00ebm n\u00eb performanc\u00ebn e produkteve tona, por edhe n\u00eb shkall\u00ebzueshm\u00ebrin\u00eb e tyre - ne kemi futur Golang (Go) n\u00eb kodin ton\u00eb teknologjik.<\/p>\n<p>Pothuajse menj\u00ebher\u00eb zbuluam se Go na lejon t\u00eb krijojm\u00eb aplikacione m\u00eb t\u00eb m\u00ebdha me nj\u00eb rritje t\u00eb performanc\u00ebs deri n\u00eb 40 her\u00eb. Me t\u00eb, ne arrit\u00ebm t\u00eb zgjerojm\u00eb produktet ekzistuese t\u00eb shkruara n\u00eb PHP, duke i p\u00ebrmir\u00ebsuar ato p\u00ebrmes kombinimit t\u00eb avantazheve t\u00eb t\u00eb dy gjuh\u00ebve.<\/p>\n<p>Ne do t\u00eb tregojm\u00eb si kombinimi i Go dhe PHP ndihmon n\u00eb zgjidhjen e detyrave reale t\u00eb zhvillimit dhe si \u00ebsht\u00eb shnd\u00ebrruar p\u00ebr ne n\u00eb nj\u00eb mjet q\u00eb mund t\u00eb na ndihmoj\u00eb p\u00ebr t'u liruar nga disa probleme t\u00eb lidhura me <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">modelin e \u2018vdekjes\u2019 s\u00eb PHP<\/a><\/noindex>.<\/p>\n<h3>Mjedisi juaj i p\u00ebrditsh\u00ebm i zhvillimit PHP<\/h3>\n<p>\nPara se t\u00eb flasim se si Go mund ta zgjoj\u00eb modelin e \u2018vdekjes\u2019 s\u00eb PHP, le t\u00eb shqyrtojm\u00eb mjedisin tuaj standard t\u00eb zhvillimit PHP.<\/p>\n<p>N\u00eb shumic\u00ebn e rasteve, ju e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u0435 aplikacionin me nj\u00eb kombinim t\u00eb serverit web nginx dhe serverit PHP-FPM. I pari sh\u00ebrben skedar\u00ebt statik\u00eb dhe redirection k\u00ebrkesat specifike te PHP-FPM, nd\u00ebrsa vet\u00eb PHP-FPM ekzekuton kodin PHP. Ndoshta ju po p\u00ebrdorni nj\u00eb kombinim m\u00eb pak t\u00eb njohur t\u00eb Apache dhe mod_php. Por ndon\u00ebse ai funksionon pak ndryshe, parimet jan\u00eb t\u00eb nj\u00ebjta.<\/p>\n<p>Le t\u00eb shohim se si PHP-FPM ekzekuton kodin e aplikacionit. Kur arrin nj\u00eb k\u00ebrkes\u00eb, PHP-FPM inicializon nj\u00eb proces PHP dyt\u00ebsor dhe detajet e k\u00ebrkes\u00ebs i kalon si pjes\u00eb e gjendjes s\u00eb tij (_GET, _POST, _SERVER etj.). <\/p>\n<p>Gjat\u00eb ekzekutimit t\u00eb skriptit PHP, gjendja nuk mund t\u00eb ndryshohet, prandaj mund t\u00eb merrni nj\u00eb set t\u00eb ri t\u00eb t\u00eb dh\u00ebnave hyr\u00ebse vet\u00ebm n\u00eb nj\u00eb m\u00ebnyr\u00eb: duke e pastruar memorien e procesit dhe e inicializoni at\u00eb p\u00ebrs\u00ebri.<\/p>\n<p>Ky model ekzekutimi ka shum\u00eb p\u00ebrfitime. Nuk keni nevoj\u00eb t\u00eb shqet\u00ebsoheni shum\u00eb p\u00ebr konsumimin e memories, t\u00eb gjith\u00eb proceset jan\u00eb plot\u00ebsisht t\u00eb izoluar, dhe n\u00ebse ndonj\u00eb prej tyre \"vdes\", do t\u00eb rinovohet automatikisht dhe kjo nuk do t\u00eb ndikoj\u00eb n\u00eb proceset e tjera. Por ka dhe disavantazhe lidhur me k\u00ebt\u00eb qasje q\u00eb shprehen gjat\u00eb p\u00ebrpjekjeve p\u00ebr t\u00eb shkall\u00ebzuar aplikacionin.<\/p>\n<h3>Disavantazhet dhe efikasiteti i ul\u00ebt i ambientit t\u00eb zakonsh\u00ebm PHP<\/h3>\n<p>\nN\u00ebse jeni duke u marr\u00eb me zhvillimin profesional n\u00eb PHP, at\u00ebher\u00eb e dini se nga duhet t\u00eb filloni nj\u00eb projekt t\u00eb ri - nga zgjedhja e nj\u00eb kuadri. Ky \u00ebsht\u00eb nj\u00eb koleksion bibliotekash p\u00ebr injektimin e var\u00ebsive, ORM, p\u00ebrkthime dhe shabllone. Dhe, sigurisht, t\u00eb gjitha t\u00eb dh\u00ebnat e p\u00ebrdoruesve mund t\u00eb vendosen leht\u00ebsisht n\u00eb nj\u00eb objekt (Symfony\/HttpFoundation ose PSR-7). Kuadrat jan\u00eb t\u00eb mrekullueshme!<\/p>\n<p>Por gjith\u00e7ka ka \u00e7mimin e vet. N\u00eb \u00e7do kuad\u00ebr t\u00eb nivelit t\u00eb nd\u00ebrmarrjeve p\u00ebr t\u00eb trajtuar nj\u00eb k\u00ebrkes\u00eb t\u00eb thjesht\u00eb nga p\u00ebrdoruesi ose nj\u00eb thirrje n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave, do t'ju duhet t\u00eb ngarkoni t\u00eb pakt\u00ebn dhjet\u00ebra skedar\u00eb, t\u00eb krijoni shum\u00eb klasa dhe t\u00eb analizoni disa konfiguracione. Por ajo q\u00eb \u00ebsht\u00eb m\u00eb e keqe \u00ebsht\u00eb se pas \u00e7do detyre duhet t\u00eb ritheksoni gjith\u00e7ka dhe t\u00eb filloni nga fillimi: \u00e7do kod q\u00eb sapo e inicializuat b\u00ebhet i pavleftsh\u00ebm, me t\u00eb cilin nuk mund t\u00eb trajtoni nj\u00eb tjet\u00ebr k\u00ebrkes\u00eb. Thoni k\u00ebt\u00eb \u00e7do programuesi q\u00eb shkruan n\u00eb ndonj\u00eb gjuh\u00eb tjet\u00ebr \u2014 dhe do ta shihni nd\u00ebrprerjen n\u00eb fytyr\u00ebn e tij.<\/p>\n<p>Inxhinier\u00ebt PHP kan\u00eb k\u00ebrkuar p\u00ebr vite me radh\u00eb m\u00ebnyra p\u00ebr t\u00eb zgjidhur k\u00ebt\u00eb problem, duke p\u00ebrdorur metoda t\u00eb treguara p\u00ebr \"ngarkim t\u00eb len\u00eb\", mikrofrafik\u00eb, biblioteka t\u00eb optimizuara, memorie cache etj. Por n\u00eb fund t\u00eb fundit, gjithmon\u00eb \u00ebsht\u00eb e nevojshme t\u00eb r\u00ebndom\u00ebsohen t\u00eb gjith\u00eb aplikacionin dhe t\u00eb fillohet nga e para, p\u00ebrs\u00ebri dhe p\u00ebrs\u00ebri.<i> (V\u00ebrejtje e p\u00ebrkthyesit: pjes\u00ebrisht ky problem do t\u00eb zgjidhet me daljen <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> n\u00eb PHP 7.4)<\/p>\n<h3>A mund PHP, duke p\u00ebrdorur Go, t\u00eb p\u00ebrballoj\u00eb m\u00eb shum\u00eb se nj\u00eb k\u00ebrkes\u00eb?<\/h3>\n<p>\n<\/i>Mund t\u00eb shkruhen skripte PHP q\u00eb jetojn\u00eb m\u00eb shum\u00eb se disa minuta (deri n\u00eb or\u00eb ose dit\u00eb): p\u00ebr shembull, detyra cron, analizues CSV, parser\u00eb radh\u00ebsh. T\u00eb gjitha ato funksionojn\u00eb sipas nj\u00eb skenari: nxjerrin nj\u00eb detyr\u00eb, e p\u00ebrmbushin at\u00eb, presin p\u00ebr tjetr\u00ebn. Kodi q\u00ebndron vazhdimisht n\u00eb memorie, duke kursyer milisekonda t\u00eb \u00e7muara, pasi ngarkimi i kuadrit dhe aplikacionit k\u00ebrkon shum\u00eb veprime shtes\u00eb.<\/p>\n<p>Por zhvillimi i skripteve afatgjata nuk \u00ebsht\u00eb aq e leht\u00eb. \u00c7do gabim e vret plot\u00ebsisht procesin, diagnostikimi i rrjedhjeve t\u00eb memories e \u00e7mend, dhe nuk mund t\u00eb p\u00ebrdoret debugging me F5 m\u00eb.<\/p>\n<p>Situata \u00ebsht\u00eb p\u00ebrmir\u00ebsuar me daljen e PHP 7: u shpik nj\u00eb mbledh\u00ebs t\u00eb besuesh\u00ebm t\u00eb mbeturinave, \u00ebsht\u00eb b\u00ebr\u00eb m\u00eb e leht\u00eb p\u00ebr t\u00eb trajtuar gabimet, dhe zgjatjet e b\u00ebrtham\u00ebs tani jan\u00eb t\u00eb mbrojtura nga rrjedhjet. Megjithat\u00eb, inxhinier\u00ebt ende duhet t\u00eb jen\u00eb t\u00eb kujdessh\u00ebm me memorien dhe t\u00eb kujtojn\u00eb problemet e gjendjes n\u00eb kod (a ekziston ndonj\u00eb gjuh\u00eb ku mund t\u00eb mos i kushtohet v\u00ebmendje k\u00ebtyre gj\u00ebrave?). Dhe megjithat\u00eb, n\u00eb PHP 7 na presin m\u00eb pak befasi.<\/p>\n<p>A \u00ebsht\u00eb e mundur t\u00eb merret modeli i pun\u00ebs me skriptet PHP q\u00eb jetojn\u00eb gjat\u00eb, ta adaptoj\u00eb at\u00eb p\u00ebr detyra m\u00eb triviale si p\u00ebrpunimi i k\u00ebrkesave HTTP dhe k\u00ebshtu t\u00eb shp\u00ebtojm\u00eb nga nevoja p\u00ebr t\u00eb ngarkuar gjith\u00e7ka nga e para me \u00e7do k\u00ebrkes\u00eb?<\/p>\n<p>P\u00ebr t\u00eb zgjidhur k\u00ebt\u00eb detyr\u00eb, fillimisht duhej t\u00eb realizohej nj\u00eb aplikacion serveri, i cili mund t\u00eb pranonte k\u00ebrkesa HTTP dhe t'i p\u00ebrcillte ato nj\u00eb nga nj\u00eb PHP punonj\u00ebsit, pa e vrar\u00eb at\u00eb \u00e7do her\u00eb.<\/p>\n<p>E dinim se do ta shkruanim nj\u00eb server web n\u00eb PHP t\u00eb past\u00ebr (PHP-PM) ose duke p\u00ebrdorur nj\u00eb zgjerim C (Swoole). Dhe ndon\u00ebse \u00e7do qasje kishte p\u00ebrfitimet e veta, asnj\u00ebra prej tyre nuk na k\u00ebnaqte \u2014 d\u00ebshironim di\u00e7ka m\u00eb shum\u00eb. Na nevojitej jo thjesht nj\u00eb server web \u2014 ne prisnim t\u00eb merrnim nj\u00eb zgjidhje q\u00eb do t\u00eb na \u00e7lironte nga problemet e \"fillimit t\u00eb r\u00ebnd\u00eb\" n\u00eb PHP, e cila gjithashtu mund t\u00eb adaptohej dhe zgjerohej leht\u00ebsisht p\u00ebr aplikacione specifike. Pra, na duhej nj\u00eb server aplikacionesh.<\/p>\n<p>A mund t\u00eb ndihmoj\u00eb Go n\u00eb k\u00ebt\u00eb? E dinim q\u00eb mund, sepse ky gjuh\u00eb kompilon aplikacionet n\u00eb skedar\u00eb binar\u00eb t\u00eb vetme; \u00ebsht\u00eb shum\u00ebplatformike; p\u00ebrdor nj\u00eb model t\u00eb elegancsh\u00ebm t\u00eb p\u00ebrpunimit paralel (concurrency) dhe nj\u00eb bibliotek\u00eb p\u00ebr pun\u00ebn me HTTP; dhe, p\u00ebrfundimisht, do t\u00eb kishim akses n\u00eb mij\u00ebra biblioteka dhe integrime open-source.<\/p>\n<h3>V\u00ebshtir\u00ebsit\u00eb e bashkimit t\u00eb dy gjuh\u00ebve t\u00eb programimit<\/h3>\n<p>\nS\u00eb pari, duhej t\u00eb p\u00ebrcaktonim se si dy ose m\u00eb shum\u00eb aplikacione do t\u00eb komunikonin me nj\u00ebri-tjetrin.<\/p>\n<p>P\u00ebr shembull, n\u00ebp\u00ebrmjet<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> nj\u00eb biblioteke t\u00eb shk\u00eblqyer<\/a><\/noindex> t\u00eb Aleks Palastras, ishte e mundur t\u00eb implementonim ndarjen e memories mes proceseve PHP dhe Go (analogjisht me mod_php n\u00eb Apache). Por kjo bibliotek\u00eb ka disa karakteristika q\u00eb e kufizojn\u00eb p\u00ebrdorimin e saj p\u00ebr zgjidhjen e problemit ton\u00eb.<\/p>\n<p>Vendos\u00ebm t\u00eb p\u00ebrdorim nj\u00eb qasje tjet\u00ebr, m\u00eb t\u00eb njohur: t\u00eb nd\u00ebrtojm\u00eb nd\u00ebrveprimin mes proceseve p\u00ebrmes soketesh\/piperash. Kjo qasje ka provuar besueshm\u00ebrin\u00eb e saj dhe \u00ebsht\u00eb optimizuar mir\u00eb n\u00eb nivelin e sistemit operativ gjat\u00eb dekadave t\u00eb kaluara.<\/p>\n<p>P\u00ebr fillim, krijuam nj\u00eb protokoll binar t\u00eb thjesht\u00eb p\u00ebr shk\u00ebmbimin e t\u00eb dh\u00ebnave mes proceseve dhe trajtimin e gabimeve gjat\u00eb d\u00ebrgimit. N\u00eb form\u00ebn e saj m\u00eb t\u00eb thjesht\u00eb, protokolli i k\u00ebtij tipi \u00ebsht\u00eb i ngjash\u00ebm me <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> me<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> me nj\u00eb krye pakete me madh\u00ebsi fikse<\/a><\/noindex> (n\u00eb rastin ton\u00eb 17 byte), i cili p\u00ebrmban informacion mbi llojin e paket\u00ebs, madh\u00ebsin\u00eb e saj dhe nj\u00eb mask\u00eb binare p\u00ebr kontrollin e integritetit t\u00eb t\u00eb dh\u00ebnave.<\/p>\n<p>Nga ana e PHP, ne p\u00ebrdor\u00ebm <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">funksionin pack<\/a><\/noindex>, nd\u00ebrsa nga ana e Go \u2014 bibliotek\u00ebn<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Nj\u00eb protokoll na dukej i pamjaftuesh\u00ebm \u2014 dhe ne shtuam mund\u00ebsin\u00eb p\u00ebr t\u00eb thirrur<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> sh\u00ebrbimet Go net\/rpc direkt nga PHP<\/a><\/noindex>. M\u00eb von\u00eb, kjo na ndihmoi shum\u00eb n\u00eb zhvillim, pasi mund t\u00eb integrojm\u00eb leht\u00ebsisht bibliotekat Go n\u00eb aplikacionet PHP. Rezultatin e k\u00ebsaj pune mund ta shihni, p\u00ebr shembull, n\u00eb nj\u00eb produkt ton\u00eb tjet\u00ebr open-source<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Shp\u00ebrndarja e detyrave n\u00eb disa PHP-pun\u00ebtor\u00eb<\/h3>\n<p>\nPas implementimit t\u00eb mekanizmit t\u00eb nd\u00ebrveprimit, filluam t\u00eb mendonim se si t\u00eb transferonim detyrat n\u00eb proceset PHP n\u00eb m\u00ebnyr\u00ebn m\u00eb efikase. Kur arrin nj\u00eb detyr\u00eb, serveri i aplikacioneve duhet t\u00eb zgjedh\u00eb nj\u00eb pun\u00ebtor t\u00eb lir\u00eb p\u00ebr ta kryer at\u00eb. N\u00ebse pun\u00ebtori\/procesi e p\u00ebrfundon pun\u00ebn me gabim ose \"vdes\", ne e heqim at\u00eb dhe krijojm\u00eb nj\u00eb t\u00eb ri n\u00eb vendin e tij. N\u00ebse pun\u00ebtori\/procesi e p\u00ebrfundon me sukses, ne e kthejm\u00eb at\u00eb n\u00eb rezerv\u00ebn e pun\u00ebtor\u00ebve t\u00eb disponuesh\u00ebm p\u00ebr t\u00eb kryer detyra.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP nuk \u00ebsht\u00eb krijuar p\u00ebr t\u00eb vdekur, ose Golang nxiton n\u00eb ndihm\u00eb\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebr ruajtjen e rezerv\u00ebs s\u00eb pun\u00ebtor\u00ebve aktiv\u00eb, ne p\u00ebrdor\u00ebm<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> kanalin e tamponizuar<\/a><\/noindex>, p\u00ebr t\u00eb hequr pun\u00ebtar\u00ebt q\u00eb papritur \"vdesin\" nga rezerva, shtuam nj\u00eb mekaniz\u00ebm p\u00ebr ndjekjen e gabimeve dhe gjendjeve t\u00eb pun\u00ebtor\u00ebve.<\/p>\n<p>Si rezultat, mor\u00ebm nj\u00eb server PHP funksional q\u00eb mund t\u00eb procesoj\u00eb \u00e7do k\u00ebrkes\u00eb t\u00eb paraqitur n\u00eb form\u00eb binar.<\/p>\n<p>Q\u00eb aplikacioni yn\u00eb t\u00eb fillonte t\u00eb funksiononte si nj\u00eb server web, duhej t\u00eb zgjidheshim nj\u00eb standard t\u00eb besuesh\u00ebm PHP p\u00ebr p\u00ebrfaq\u00ebsimin e \u00e7do k\u00ebrkese HTTP t\u00eb ardhur. N\u00eb rastin ton\u00eb, ne thjesht <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">konvertojm\u00eb<\/a><\/noindex> net\/http-k\u00ebrcim nga Go n\u00eb formatin<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, p\u00ebr t'u b\u00ebr\u00eb n\u00eb p\u00ebrputhje me shumic\u00ebn e kornizave PHP t\u00eb disponueshme sot.<\/p>\n<p>Duke qen\u00eb se PSR-7 konsiderohet i pandryshuesh\u00ebm (disa do t\u00eb thon\u00eb se teknikisht nuk \u00ebsht\u00eb k\u00ebshtu), zhvilluesit p\u00ebrballen me sfid\u00ebn q\u00eb t\u00eb shkruajn\u00eb aplikacione q\u00eb n\u00eb thelb nuk e trajtojn\u00eb k\u00ebrkes\u00ebn si nj\u00eb entitet global. Kjo kombinon shk\u00eblqyesh\u00ebm me konceptin e proceseve PHP afatgjat\u00eb. Zbatimi yn\u00eb p\u00ebrfundimtar, q\u00eb ende nuk ka marr\u00eb nj\u00eb em\u00ebr, dukej k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP nuk \u00ebsht\u00eb krijuar p\u00ebr t\u00eb vdekur, ose Golang nxiton n\u00eb ndihm\u00eb\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Prezantimi i RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> server me performanc\u00eb t\u00eb lart\u00eb p\u00ebr aplikacionet PHP<\/a><\/noindex><\/h3>\n<p>\nDetyra jon\u00eb e par\u00eb n\u00eb testim ishte nj\u00eb API-backend, ku periudh\u00ebrisht ndodhnin shp\u00ebrthime t\u00eb papritura t\u00eb k\u00ebrkesave (shum\u00eb m\u00eb shpesh se zakonisht). Megjith\u00ebse n\u00eb shumic\u00ebn e rasteve kapacitetet e nginx ishin t\u00eb mjaftueshme, tani p\u00ebr tani ndesh\u00ebm rregullisht me gabimin 502, sepse nuk mund\u00ebm ta balancojm\u00eb sistemin mjaft shpejt p\u00ebr t\u00eb pritur rritjen e pritur t\u00eb ngarkes\u00ebs.<\/p>\n<p>P\u00ebr t\u00eb z\u00ebvend\u00ebsuar k\u00ebt\u00eb zgjidhje, n\u00eb fillim t\u00eb vitit 2018, ne vendos\u00ebm serverin ton\u00eb t\u00eb par\u00eb PHP\/Go p\u00ebr aplikacione. Dhe menj\u00ebher\u00eb mor\u00ebm nj\u00eb efekt t\u00eb pabesuesh\u00ebm! Ne jo vet\u00ebm q\u00eb u shk\u00ebput\u00ebm plot\u00ebsisht nga gabimi 502, por gjithashtu arrit\u00ebm t\u00eb pak\u00ebsonim numrin e server\u00ebve me dy t\u00eb tretat, duke kursyer nj\u00eb sasi t\u00eb madhe parash dhe tabletash p\u00ebr dhimbjen e kok\u00ebs p\u00ebr inxhinier\u00ebt dhe menaxher\u00ebt e produkteve.<\/p>\n<p>N\u00eb mes t\u00eb vitit, ne p\u00ebrmir\u00ebsuam zgjidhjen ton\u00eb, e publikova at\u00eb n\u00eb GitHub n\u00ebn licenc\u00ebn MIT dhe e quajt\u00ebm <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, duke theksuar k\u00ebshtu shpejt\u00ebsin\u00eb dhe efikasitetin e tij t\u00eb jasht\u00ebzakonsh\u00ebm.<\/p>\n<h3>Si mund t\u00eb p\u00ebrmir\u00ebsoj\u00eb RoadRunner stivin tuaj t\u00eb zhvillimit<\/h3>\n<p>\nP\u00ebrdorimi<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> na lejohet t\u00eb p\u00ebrdorim Middleware net\/http n\u00eb an\u00ebn e Go, p\u00ebr t\u00eb zhvilluar verifikimin e JWT-n\u00eb edhe para se k\u00ebrkesa t\u00eb arrij\u00eb n\u00eb PHP, si dhe p\u00ebr t\u00eb trajtuar WebSockets dhe p\u00ebr t\u00eb agreguar globalisht gjendjet n\u00eb Prometheus. <\/p>\n<p>Fal\u00eb RPC t\u00eb integruar, mund t\u00eb hapim API t\u00eb \u00e7do biblioteke Go p\u00ebr PHP pa shkruar ekstensionet-mb\u00ebshtet\u00ebse. \u00c7ka \u00ebsht\u00eb edhe m\u00eb e r\u00ebnd\u00ebsishme, me RoadRunner mund t\u00eb vendosim servera t\u00eb rinj, t\u00eb ndrysh\u00ebm nga HTTP. Si\u00e7 shembuj mund t\u00eb p\u00ebrmenden ekzekutimi i trajtuesve n\u00eb PHP<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, krijimi i parser\u00ebve t\u00eb besuesh\u00ebm t\u00eb radh\u00ebve dhe madje edhe shtimi<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> n\u00eb aplikacionet tona.<\/p>\n<p>Me ndihm\u00ebn e komuniteteve PHP dhe Go, ne rrit\u00ebm stabilitetin e zgjidhjes, n\u00eb disa teste rrit\u00ebm performanc\u00ebn e aplikacioneve deri n\u00eb 40 her\u00eb, p\u00ebrmir\u00ebsuam mjetet p\u00ebr debugging, realizuam integrimin me framework-un Symfony dhe shtuam mb\u00ebshtetje p\u00ebr HTTPS, HTTP\/2, plugina dhe PSR-17.<\/p>\n<h3>P\u00ebrfundim<\/h3>\n<p>\nDisa ende jan\u00eb t\u00eb kapluar nga koncepti i vjet\u00ebr p\u00ebr PHP si nj\u00eb gjuh\u00eb t\u00eb ngadalt\u00eb dhe t\u00eb r\u00ebnd\u00eb, e p\u00ebrshtatshme vet\u00ebm p\u00ebr t\u00eb shkruar plugina p\u00ebr WordPress. K\u00ebta njer\u00ebz madje mund t\u00eb thon\u00eb se PHP ka nj\u00eb kufizim t\u00eb till\u00eb: kur aplikacioni b\u00ebhet mjaft i madh, duhet t\u00eb zgjidhni nj\u00eb gjuh\u00eb m\u00eb \"t\u00eb pjekur\" dhe ta rip\u00ebrpunoni baz\u00ebn e kodit q\u00eb \u00ebsht\u00eb grumbulluar p\u00ebr shum\u00eb vjet.<\/p>\n<p>P\u00ebr t\u00eb gjitha k\u00ebto d\u00ebshirojm\u00eb t\u00eb themi: mendoni edhe nj\u00eb her\u00eb. Ne besojm\u00eb se vet\u00ebm ju vet\u00eb vendosni ndonj\u00eb kufizim p\u00ebr PHP. Mund t\u00eb shpenzoni t\u00ebr\u00eb jet\u00ebn duke kaluar nga nj\u00eb gjuh\u00eb n\u00eb tjetr\u00ebn, duke u p\u00ebrpjekur t\u00eb gjeni kombinimin ideal me nevojat tuaja, ose mund t\u00eb filloni ta shihni gjuh\u00ebt si mjete. K\u00ebto sakrifica t\u00eb imagjinuara t\u00eb gjuh\u00ebs si PHP n\u00eb t\u00eb v\u00ebrtet\u00eb mund t\u00eb jen\u00eb arsye p\u00ebr suksesin e saj. Dhe n\u00ebse e bashkoni me nj\u00eb gjuh\u00eb tjet\u00ebr si Go, do t\u00eb krijoni produkte shum\u00eb m\u00eb t\u00eb fuqishme sesa n\u00ebse do t\u00eb kufizoheshit vet\u00ebm me nj\u00eb gjuh\u00eb.<\/p>\n<p>Pas pun\u00ebs me kombinimin Go dhe PHP, mund t\u00eb deklarojm\u00eb se i kemi dashuruar. Nuk planifikuar t\u00eb sakrifikojm\u00eb nj\u00eb n\u00eb favor t\u00eb tjetrit \u2014 p\u00ebrkundrazi, do t\u00eb k\u00ebrkojm\u00eb m\u00ebnyra p\u00ebr t\u00eb nxjerr\u00eb edhe m\u00eb shum\u00eb p\u00ebrfitime nga ky stiv i dyfisht\u00eb.<\/p>\n<p><i>UPD: mir\u00ebpresim krijuesin e RoadRunner dhe bashkautor t\u00eb artikullit origjinal \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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 nuk \u00ebsht\u00eb krijuar p\u00ebr t'u shuar, ose Golang \u00ebsht\u00eb k\u00ebtu p\u00ebr t\u00eb ndihmuar | ProHoster","description":"P\u00ebrsh\u00ebndetje, Habr!","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}