RoadRunner: PHP non aedificatur ad mortem vel ad salutem Golang

RoadRunner: PHP non aedificatur ad mortem vel ad salutem Golang

Salve, Habr! Nos active ad Badoo opus in PHP perficienturquippe quae huius linguae salutaris ratio et causa perficiendi habeat maiusculas pecuniae. Plus quam decem annos abhinc PHP-FPM hoc creavimus, quod primo inaequaliter pro PHP statutum erat, et postea in distributione officialium facta est.

His annis PHP magnum progressum fecit: purgamentum collector emendavit, stabilitatis gradum crevit - hodie daemones scribere potes et scripta vivax in PHP sine ullis quaestionibus. Hoc Spiral Explorator ulterius progredi permisit: Road Runner, dissimilis PHP-FPM, memoriam inter petitiones non mundat, quae additional beneficia perficiendi praebet (quamvis accessus processus evolutionis implicat). Nunc hoc instrumentum experimur, sed eventus nondum communicamus. Quo magis iocum exspectes; Nos translationem denuntiationis Road Runner de Spiral Scout praedicamus.

Accessus a articulo nobis proximus est: cum solvendo problemata nostra, frequentius etiam compositione PHP et Ite utimur, utriusque linguae beneficium accipientes, nec unum pro altero omissum.

Enjoy!

Praeteritis decem annis applicationes pro societatibus e indice creavimus Fortuna 500ac negotiationibus non plusquam 500 utentibus audientibus. Hoc tempore, fabrum nostrorum maxime tergum in PHP evolvit. Sed ante biennium aliquid magnum impulsum fecit non solum in operando fructus, sed etiam in scalability eorum - Golang induximus (Ite) ad acervum technologiae nostrae.

Fere statim invenimus Ire permittentes nobis ampliores applicationes aedificare cum ad 40x velociores effectus. Cum eo potuimus producere res in PHP scriptas, eas componendo commoda utriusque linguae augere.

Dicemus tibi quomodo coniunctio Go et PHP adiuvat quaestiones explicandi reales solvendas et quomodo in instrumentum nobis versa est quae aliquas difficultates cum adiunctis eliminare potest. PHP mori exemplar.

Tuum Quotidie PHP Development Opera

Priusquam loquimur quomodo uti potes Ire ad exemplar morientis vivificae PHP, inspice vexillum tuum in ambitus evolutionis PHP.

Pluribus in casibus, applicationis usus es e coniunctione nginx servientis et PHP-FPM currentis. Prima imaginum statarum inservit ac postulata specifica ad PHP-FPM redigit, et ipsa PHP-FPM codicem PHP exsequitur. Fortasse minus populari compositione ab Apache et mod_php uteris. Sed licet paulo aliter faciat, principia sunt eadem.

Intueamur quomodo PHP-FPM applicationis codicem faciat. Cum petitio advenit, puerum PHP processum initialem PHP-FPM attingit et instantiam rogationis ut partem status sui transit (_GET, _POST, _SERVER, etc.).

Status in executione scriptionis PHP mutare non potest, ideo una tantum via est ut novum institutum notitiarum inputationis obtineat: processus memoriam purgando et reinitializationem.

Huius executionis exemplum multa commoda habet. De phthisi memoriae non multum solliciti, omnes processus penitus sunt segregati, et si unus ex eis decedit, ipso facto recreabitur sine reliquo processu. Sed aditus etiam incommoda habet, quae apparent, cum applicatione conantur ascendere.

Incommoda et inefficaces ambitus regularis PHP

Si in evolutione professionali PHP versaris, tunc scis ubi novum consilium inire - eligendo compagem. Constat ex bibliothecis pro dependentia iniectio, ORMs, translationibus et exemplaribus. Et sane, omnes initus usoris commode in unum obiectum collocari possunt (Symfony/HttpFoundation vel PSR-7). Tabulata frigida sunt!

Sed pretium omnia habet. In quolibet incepti plano compage, ut processus simplex postulatio usoris aut accessum datorum, saltem justos tabularum onerare debebis, numerosas classes crea, et plures figuras parse. Sed pessimum est quod post unumquodque opus peractis opus erit omnia retexere ac rursus incipient: totum codicem, quem modo initiasti, inutilem evadit, cuius ope aliam petitionem iam non procedes. Dic hoc cuilibet programmatori qui alia lingua scribit, et videbis stuporem in facie sua.

PHP fabrum peregerunt annos quaerentes vias ad solvendum hoc problema, utentes callidis pigris technicis onerationes, microframeworks, bibliothecarum optimizedium, thesaurorum, etc. Sed in fine adhuc habes totam applicationem retexere atque iterum iterumque committitur. (Notatur interpres: problema hoc ex parte solvetur cum adveniente preload in PHP 7.4)

Can PHP with Go survive more than one request?

Potest scribere scripta PHP quae paucis momentis longiora erunt (usque ad horas vel dies): exempli gratia, opera cron, parsers CSV, busters queue. Omnia faciunt iuxta eundem missionem: negotium recuperant, faciunt, exspectant proximum. Codex in memoria residet, servatis pretiosissimis millium secundis totidem gradibus additis ad compagem et applicationem oneratis.

Sed consequat tempor est non facilisis. Omnis error processum omnino necat, memoria diagnoscentia scillam te insanas agit, et F5 debugging amplius uti non potes.

Res emendavit cum emissione PHP 7: certa purgamenta collectoris apparuit, facilior facta est ad errores tractandos, et extensiones nuclei a libero libero nunc custodiuntur. Verum, fabrum adhuc opus est ut memoria diligenter studeant et conscii sint rerum publicarum in codice (estne sermo ubi de his rebus non debemus solliciti esse?). Et tamen, in PHP 7, pauciores admirationes nos manent.

Licetne exemplum accipere operandi scriptis PHP longaevientibus, illud ad leviora opera accommodare sicut petitiones HTTP processus, et necessitatem tollendam, ut omnia a de integro singula petant onerandi?

Ad hanc problema solvendam, primum opus est ad applicationem servo deducendi, qui petitiones HTTP accipere potuit ac singulatim ad PHP operarium transmittere, quin omni tempore interficeret.

Scivimus nos telam server in puro PHP (PHP-PM) scribere posse vel extensione C (Swoole). Et licet utraque methodus sua merita habeat, utraque optiones nobis non convenit - plus aliquid voluimus. Desideravimus plus quam iustus servitor telae - optavimus solutionem acquirere quae nos salvare posset ab quaestionibus "inceptio duro" in PHP, quod simul facile aptari et augeri ad certas applicationes poterat. Id est, servo applicationis opus est.

Potestne auxilium cum hoc ire? Cognovimus id quod lingua applicationes in singula binaria componit; suggestum crucis est; suo proprio, elegantissimo, processui parallelo (concurrency) et bibliotheca utitur ad operandum cum HTTP; ac denique millia bibliothecarum apertarum et integrationum nobis praesto erunt.

Difficultates programmandi duas linguas

Primus gradus erat statuere quomodo duae vel plures applicationes inter se communicarent.

Exempli gratia, usura Mirum bibliotheca Alex Palaestras memoriam communicare potuit inter PHP et Processus Go (similis mod_php in Apache). Sed haec bibliotheca notas habet quae suum usum finiunt ad problema solvendum.

Placuimus alio communius uti, accedere: commercium inter processuum aedificare per bases/pipelinas. Hic aditus fidem suam super praeteritum decennium probavit et bene optimized est in gradu systematis operantis.

In primis nos protocollum binarium simplex creavimus ad notitias permutandas inter processuum et errores transmittendos tractandos. In simplicissima sua forma hoc genus protocolli simile est netstring с certa magnitudine packet header (in nostro casu 17 bytes), quod de speciebus fasciculi notitias continet, eius magnitudinem et larvam binariam ad integritatem datam reprimendam.

In PHP parte utendum est stipant munuset in Go parte bibliothecae modum translitterandi / binarii.

Visum nobis est unum protocollum non satis esse β€” sic vocandi facultatem addimus Ite officia rete/rpc directe ex PHP. Hoc postea multum nobis in evolutione adiuvit, quod facile potuimus Go libraries in applicationes PHP integrare. Effectus huius operis videri potest, exempli gratia, in alio fonte aperto Goridge.

Distribuendi opera per multa PHP operarios

Post mechanismum commercium exsequentes, cogitare coepimus quomodo ad negotia ad processum PHP efficacissime transferamus. Cum negotium advenit, ministrator applicationis liberum opificem ad perficiendum eligere debet. Si operarius/processus errore terminatur vel "moriatur", eam removemus et novam creamus ut in ea substituamus. Et si processum opificis feliciter consummavit, eam ad piscinam opificum opera perficienda praesto reddimus.

RoadRunner: PHP non aedificatur ad mortem vel ad salutem Golang

Ad congregem ad active operarios ad nos usus piscinam buffered channel, ut operarios e stagno inopinato "mortuos" tolleret, mechanismum ad errores et status opificum persequendos addidimus.

Itaque servo PHP laborantem accepimus capacem ad aliquas petitiones in forma binaria exhibitas expediendas.

Ut applicatio ad munus ut telae server, certum PHP vexillum eligere debebamus ad petitiones venientium HTTP repraesentandas. In casu nostro non solum transform retia / http postulatio ab Ite ad format Eta 7,ita ut cum plurimis PHP compagibus hodie praesto esse possit.

Quia PSR-7 immutabilis censetur (quidam technice non est), tincidunt scribere applicationes habent quae rogationem tamquam entitatem globalem non fundamentaliter tractant. Hoc bene convenit cum processibus PHP vivacis conceptu. Nostra exsecutio finalis, quae nondum nominata est, hoc apparuit:

RoadRunner: PHP non aedificatur ad mortem vel ad salutem Golang

Introducendis RoadRunner - summus perficientur servo applicationem PHP

Primum examen operis nostri API backend erat, qui intervenit inopinatos impetus petitionum (multo saepius solito). Quamvis nginx in pluribus sufficiens esset, nos semper 502 errores offendimus quia systema systemati oneris expectati satis cito aequare non potuimus.

Ad hanc solutionem reponendo, primum nostrum PHP/Ite applicationem servo in primis MMXVIII direximus. Statimque incredibilem effectum venimus! Non solum errorum 2018 penitus depulimus, sed etiam numerum ministrantium per duas tertias partes reducere potuimus, salvis multa pecuniarum et capitis doloribus ad fabrum ac productos mancipes.

Medio anno, solutionem nostram perfecissemus, eam in GitHub sub MIT licentia divulgavimus et appellavimus RoadRunnereffert incredibili celeritate atque efficacitate.

Quam RoadRunner amplio vestri progressio Stack

application RoadRunner permisit nobis utere Medio rete/http in Go parte ut verificationem JWT perficiat antequam rogationem PHP etiam attingat, necnon ad collectionem in Prometheo pertractandas cum telas et globali statu.

Gratias in RPC constructo, API alicuius Go bibliothecae aperire potes pro PHP sine scripturae extensione involucris. Potius, Road Runner ad novas non-HTTP servientes explicandas adhiberi potest. Exempla deductis tracto in PHP Lambda AWS, certam queue busters creando et addendo gRPC ad nos utilia.

Auxiliis PHP et Go Communitatibus, solutionis stabilitatem auximus, applicationes effectionis auximus usque ad 40 tempora in quibusdam probationibus, instrumentis debugging emendatis, integrationem perficiendam cum compage Symfonyarum, et subsidia addita pro HTTPS, HTTP/ 2, plugins, et PSR-17.

conclusio,

Nonnulli adhuc in conspectu PHP obsoletae comprehenduntur sicut lingua pressa et gravia solum bonum ad scripturam WordPress plugins. Hi etiam dicere possunt PHP limitationem habere: cum applicatio satis ampla evadat, linguam "maturam" eligere debes et basim codicem qui per multos annos congesta est rescribe.

Ad haec respondere volo: iterum cogita. Credimus solum te ad PHP restrictiones aliquas constituere posse. Totam vitam tuam saltare potes ex lingua in aliam saliendo, quaerendo perfectam congruentem necessitati tuae, vel incipere potes cogitare linguas ut instrumenta. Percepta delicta linguae veluti PHP effecta esse causas prosperi sui. Et si eam cum alia lingua sicut Go iungas, multo potiora producta creare potes quam si una tantum lingua limitata esses.

Facto cum complexione Go et PHP, dicere possumus eos diligamus. Unum pro altero immolare non cogitamus, sed potius vias quaerimus ut ex hoc duali acervo plus valeat.

UPD: Gratamus creatorem RoadRunner et co-autorem articuli originalis - Lachesis

Source: www.habr.com