{"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\/it\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP non \u00e8 stato creato per morire, o Golang corre in aiuto","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP non \u00e8 stato creato per morire, o Golang corre in aiuto\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCiao, Habr! Noi di Badoo stiamo attivamente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">lavorando sulle performance di PHP<\/a><\/noindex>, poich\u00e9 abbiamo un sistema abbastanza grande in questo linguaggio e la questione delle performance \u00e8 una questione di risparmio. Pi\u00f9 di dieci anni fa abbiamo creato PHP-FPM, che inizialmente era un insieme di patch per PHP, e successivamente \u00e8 stato integrato nella versione ufficiale.<\/p>\n<p>Negli ultimi anni PHP ha fatto grandi progressi: il garbage collector \u00e8 migliorato, il livello di stabilit\u00e0 \u00e8 aumentato: oggi \u00e8 possibile scrivere demoni e script a lungo termine in PHP senza particolari problemi. Questo ha permesso a Spiral Scout di andare oltre: RoadRunner, a differenza di PHP-FPM, non libera la memoria tra le richieste, il che offre un ulteriore guadagno in termini di performance (anche se questo approccio complica il processo di sviluppo). Attualmente stiamo sperimentando con questo strumento, ma non abbiamo ancora risultati da condividere. Per rendere l'attesa pi\u00f9 divertente, <b>pubblichiamo la traduzione dell'annuncio di RoadRunner da Spiral Scout.<\/b><\/p>\n<p>L'approccio dell'articolo ci \u00e8 vicino: nella risoluzione delle nostre problematiche utilizziamo anch'esso la combinazione di PHP e Go, ottenendo i vantaggi di entrambi i linguaggi e non rinunciando a uno a favore dell'altro.<\/p>\n<p>Buon divertimento!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Negli ultimi dieci anni abbiamo creato applicazioni sia per aziende della lista <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, sia per business con un pubblico di non pi\u00f9 di 500 utenti. Durante tutto questo tempo i nostri ingegneri hanno sviluppato il backend prevalentemente in PHP. Ma due anni fa qualcosa ha influito notevolmente non solo sulle performance dei nostri prodotti, ma anche sulla loro scalabilit\u00e0: abbiamo introdotto Golang (Go) nel nostro stack tecnologico.<\/p>\n<p>Quasi immediatamente abbiamo scoperto che Go ci consente di creare applicazioni pi\u00f9 grandi con un aumento delle performance fino a 40 volte. Grazie a questo, siamo stati in grado di espandere i prodotti esistenti scritti in PHP, migliorandoli grazie alla combinazione dei vantaggi di entrambi i linguaggi.<\/p>\n<p>Vi racconteremo come la combinazione di Go e PHP aiuta a risolvere problemi reali di sviluppo e come \u00e8 diventata per noi uno strumento capace di alleviare alcune problematiche legate alla <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">modello \"morente\" di PHP<\/a><\/noindex>.<\/p>\n<h3>Il vostro ambiente quotidiano di sviluppo PHP<\/h3>\n<p>\nPrima di raccontare come utilizzare Go per rivitalizzare il modello \"morente\" di PHP, diamo un'occhiata al vostro standard ambiente di sviluppo PHP.<\/p>\n<p>Nella maggior parte dei casi, avvii l'applicazione utilizzando una combinazione di server web nginx e server PHP-FPM. Il primo gestisce i file statici e reindirizza a PHP-FPM le richieste specifiche, mentre PHP-FPM esegue il codice PHP. \u00c8 possibile che tu stia utilizzando una combinazione meno popolare di Apache e mod_php. Anche se funziona in modo leggermente diverso, i principi rimangono gli stessi.<\/p>\n<p>Consideriamo come PHP-FPM esegue il codice dell'applicazione. Quando arriva una richiesta, PHP-FPM inizializza un processo PHP secondario e passa i dettagli della richiesta come parte del suo stato (_GET, _POST, _SERVER, ecc.). <\/p>\n<p>Lo stato non pu\u00f2 cambiare durante l'esecuzione dello script PHP, quindi un nuovo set di dati in ingresso pu\u00f2 essere ottenuto solo in un modo: liberando la memoria del processo e inizializzandolo nuovamente.<\/p>\n<p>Questo modello di esecuzione ha molti vantaggi. Non devi preoccuparti eccessivamente del consumo di memoria, tutti i processi sono completamente isolati e se uno di essi \"muore\", verr\u00e0 ricreato automaticamente e ci\u00f2 non influenzer\u00e0 gli altri processi. Ma ci sono anche svantaggi in questo approccio, che si manifestano quando si cerca di scalare l'applicazione.<\/p>\n<h3>Svantaggi e inefficienze dell'ambiente PHP tradizionale<\/h3>\n<p>\nSe ti occupi di sviluppo professionale in PHP, sai da dove iniziare un nuovo progetto: dalla scelta di un framework. Questo rappresenta librerie per l'iniezione delle dipendenze, ORM, traduzioni e modelli. E, naturalmente, tutti i dati di input dell'utente possono essere comodamente inseriti in un unico oggetto (Symfony\/HttpFoundation o PSR-7). I framework sono fantastici!<\/p>\n<p>Ma tutto ha il suo prezzo. In qualsiasi framework di livello enterprise, per gestire una semplice richiesta dell'utente o una chiamata al database, dovrai caricare almeno decine di file, creare numerose classi e analizzare diverse configurazioni. Ma la cosa peggiore \u00e8 che dopo aver eseguito ogni compito, dovrai azzerare tutto e ricominciare: tutto il codice che hai appena inizializzato diventa inutile, poich\u00e9 non potrai elaborare un'altra richiesta con esso. Dillo a qualsiasi programmatore che scrive in un altro linguaggio e vedrai un'espressione di incredulit\u00e0 sul suo volto.<\/p>\n<p>Gli ingegneri PHP hanno cercato per anni modi per risolvere questo problema, utilizzando tecniche ben congegnate di \"lazy loading\", microframework, librerie ottimizzate, cache, ecc. Ma alla fine, si finisce comunque per riavviare l'intera applicazione e ricominciare da capo, ancora e ancora.<i> (Nota del traduttore: questa problematica sar\u00e0 parzialmente risolta con l'arrivo <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> di PHP 7.4)<\/p>\n<h3>PHP pu\u00f2 gestire pi\u00f9 di una richiesta alla volta grazie a Go?<\/h3>\n<p>\n<\/i>\u00c8 possibile scrivere script PHP che durano pi\u00f9 di qualche minuto (fino a ore o giorni): ad esempio, attivit\u00e0 cron, parser CSV, gestori di queue. Tutti seguono lo stesso schema: estraggono un compito, lo eseguono, poi aspettano il successivo. Il codice rimane in memoria, risparmiando preziosi millisecondi, poich\u00e9 richiede molte operazioni aggiuntive per caricare il framework e l'applicazione.<\/p>\n<p>Tuttavia, sviluppare script a lungo termine non \u00e8 cos\u00ec semplice. Qualsiasi errore interrompe completamente il processo, diagnosticare le perdite di memoria \u00e8 frustrante e non si pu\u00f2 pi\u00f9 utilizzare il debug con F5.<\/p>\n<p>La situazione \u00e8 migliorata con l'uscita di PHP 7: \u00e8 stato introdotto un affidabile garbage collector, la gestione degli errori \u00e8 diventata pi\u00f9 facile e le estensioni del core sono ora protette dalle perdite di memoria. Tuttavia, gli ingegneri devono ancora prestare attenzione alla memoria e tenere presente i problemi di stato nel codice (c'\u00e8 un linguaggio in cui non si devono considerare questi aspetti?). Eppure, in PHP 7 ci sono meno sorprese.<\/p>\n<p>\u00c8 possibile prendere il modello di lavoro con script PHP a lungo termine, adattarlo a compiti pi\u00f9 banali come la gestione delle richieste HTTP e cos\u00ec liberarsi dalla necessit\u00e0 di caricare tutto da zero ad ogni richiesta?<\/p>\n<p>Per affrontare questa sfida, era necessario implementare un'applicazione server in grado di ricevere richieste HTTP e reindirizzarle una ad una a un worker PHP, senza interrompere il processo ogni volta.<\/p>\n<p>Sapevamo di poter scrivere un web server in PHP puro (PHP-PM) oppure utilizzando un'estensione C (Swoole). Sebbene entrambi i metodi avessero i loro vantaggi, non ci soddisfacevano \u2014 volevamo qualcosa di pi\u00f9. Avevamo bisogno non solo di un web server, ma di una soluzione in grado di liberarci dai problemi legati al \"lento avvio\" in PHP, che potesse essere facilmente adattata ed espansa per applicazioni specifiche. In altre parole, avevamo bisogno di un server applicativo.<\/p>\n<p>Il Go pu\u00f2 aiutare in questo? Sapevamo di s\u00ec, perch\u00e9 questo linguaggio compila le applicazioni in singoli file binari; \u00e8 multipiattaforma; utilizza un modello di concorrenza molto elegante e una libreria per la gestione di HTTP; e infine, avremo accesso a migliaia di librerie open-source e integrazioni.<\/p>\n<h3>Difficolt\u00e0 nell'unire due linguaggi di programmazione<\/h3>\n<p>\nIn primo luogo, era necessario definire come due o pi\u00f9 applicazioni avrebbero comunicato tra loro.<\/p>\n<p>Ad esempio, utilizzando<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> una meravigliosa libreria<\/a><\/noindex> di Alex Pal\u00e9stras, era possibile realizzare la condivisione della memoria tra i processi PHP e Go (simile a mod_php in Apache). Tuttavia, questa libreria ha delle peculiarit\u00e0 che limitano il suo utilizzo per il nostro scopo.<\/p>\n<p>Abbiamo deciso di adottare un approccio diverso e pi\u00f9 comune: costruire l'interazione tra i processi tramite socket\/pipeline. Questo approccio ha dimostrato la sua affidabilit\u00e0 negli ultimi decenni ed \u00e8 stato ben ottimizzato a livello di sistema operativo.<\/p>\n<p>Per iniziare, abbiamo creato un protocollo binario semplice per lo scambio di dati tra i processi e la gestione degli errori di trasmissione. Nella sua forma pi\u00f9 semplice, un protocollo di questo tipo assomiglia a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> con<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> con un'intestazione di pacchetto a dimensione fissa<\/a><\/noindex> (nel nostro caso 17 byte), che contiene informazioni sul tipo di pacchetto, la sua dimensione e una maschera binaria per il controllo dell'integrit\u00e0 dei dati.<\/p>\n<p>Dal lato PHP abbiamo utilizzato <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">la funzione pack<\/a><\/noindex>, e dal lato Go \u2014 la libreria<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Ci siamo resi conto che un solo protocollo non bastava \u2014 e abbiamo aggiunto la possibilit\u00e0 di chiamare<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> i servizi Go net\/rpc direttamente da PHP<\/a><\/noindex>. In seguito, questo ci ha molto aiutato nello sviluppo, poich\u00e9 potevamo integrare facilmente le librerie Go nelle applicazioni PHP. Il risultato di questo lavoro pu\u00f2 essere visto, ad esempio, in un altro nostro prodotto open-source<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Distribuzione dei compiti tra pi\u00f9 worker PHP<\/h3>\n<p>\nDopo aver implementato il meccanismo di interazione, abbiamo iniziato a pensare a come trasmettere le attivit\u00e0 ai processi PHP nel modo pi\u00f9 efficiente possibile. Quando arriva un compito, il server delle applicazioni deve selezionare un worker libero per eseguirlo. Se il worker\/processo ha terminato il lavoro con un errore o \u00e8 \"morto\", lo eliminiamo e creiamo un nuovo worker in sostituzione. Se invece il worker\/processo ha completato con successo il suo lavoro, lo restituiamo al pool di worker disponibili per l'esecuzione dei compiti.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP non \u00e8 stato creato per morire, o Golang corre in aiuto\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer memorizzare il pool di worker attivi abbiamo utilizzato<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> un canale bufferizzato<\/a><\/noindex>, per rimuovere in maniera inattesa i worker \"morti\" dal pool, abbiamo aggiunto un meccanismo di monitoraggio degli errori e degli stati dei worker.<\/p>\n<p>Di conseguenza, abbiamo ottenuto un server PHP operativo in grado di gestire qualsiasi richiesta presentata in forma binaria.<\/p>\n<p>Affinch\u00e9 la nostra applicazione inizi a funzionare come un server web, \u00e8 stato necessario scegliere uno standard PHP affidabile per rappresentare qualsiasi richiesta HTTP in ingresso. Nel nostro caso, noi semplicemente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">convertiamo<\/a><\/noindex> la richiesta net\/http da Go nel formato<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, in modo che sia compatibile con la maggior parte dei framework PHP disponibili oggi.<\/p>\n<p>Poich\u00e9 PSR-7 \u00e8 considerato immutabile (alcuni diranno che tecnicamente non \u00e8 cos\u00ec), gli sviluppatori devono scrivere applicazioni che in linea di principio non trattano la richiesta come un'entit\u00e0 globale. Questo si sposa perfettamente con il concetto di processi PHP di lunga vita. La nostra implementazione finale, che non ha ancora ricevuto un nome, era cos\u00ec:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP non \u00e8 stato creato per morire, o Golang corre in aiuto\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Presentiamo RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> un server PHP ad alte prestazioni<\/a><\/noindex><\/h3>\n<p>\nIl nostro primo compito di test \u00e8 stato un backend API, dove si verificavano periodicamente picchi imprevisti di richieste (molto pi\u00f9 frequentemente del normale). Anche se nella maggior parte dei casi le capacit\u00e0 di nginx erano sufficienti, ci siamo regolarmente imbattuti nell'errore 502, poich\u00e9 non riuscivamo a bilanciare il sistema abbastanza velocemente per far fronte all'aumento previsto del carico.<\/p>\n<p>Per sostituire questa soluzione, all'inizio del 2018 abbiamo lanciato il nostro primo server di applicazioni PHP\/Go. E abbiamo subito ottenuto un effetto incredibile! Non solo abbiamo completamente eliminato l'errore 502, ma siamo anche riusciti a ridurre di due terzi il numero di server, risparmiando un sacco di soldi e alleviando il mal di testa per ingegneri e manager di prodotto.<\/p>\n<p>A met\u00e0 dell'anno abbiamo perfezionato la nostra soluzione, pubblicandola su GitHub con licenza MIT e chiamandola <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, sottolineando cos\u00ec la sua incredibile velocit\u00e0 ed efficienza.<\/p>\n<h3>Come RoadRunner pu\u00f2 migliorare il tuo stack di sviluppo<\/h3>\n<p>\nApplicazione<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> ci ha permesso di utilizzare Middleware net\/http dalla parte di Go, per eseguire la verifica JWT prima che la richiesta arrivi a PHP, cos\u00ec come per gestire WebSocket e aggregare globalmente stati in Prometheus. <\/p>\n<p>Grazie al RPC integrato, \u00e8 possibile aprire API di qualsiasi libreria Go per PHP senza scrivere estensioni di wrapping. Ci\u00f2 che \u00e8 ancora pi\u00f9 importante, con RoadRunner \u00e8 possibile distribuire nuovi server che differiscono da HTTP. Esempi includono l'avvio di gestori in PHP<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, la creazione di robusti parser di code e persino l'aggiunta<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> alle nostre applicazioni.<\/p>\n<p>Con l'aiuto delle comunit\u00e0 PHP e Go, abbiamo aumentato la stabilit\u00e0 della soluzione, in alcuni test migliorando le prestazioni delle applicazioni fino a 40 volte, perfezionato gli strumenti di debug, implementato l'integrazione con il framework Symfony e aggiunto il supporto per HTTPS, HTTP\/2, plugin e PSR-17.<\/p>\n<h3>Conclusione<\/h3>\n<p>\nAlcuni sono ancora prigionieri di un'idea obsoleta di PHP come un linguaggio lento e ingombrante, adatto solo per scrivere plugin per WordPress. Queste persone potrebbero persino dire che PHP ha un tale limite: quando l'applicazione diventa abbastanza grande, \u00e8 necessario scegliere un linguaggio pi\u00f9 \"maturo\" e riscrivere il codice accumulato in molti anni.<\/p>\n<p>A tutto ci\u00f2 vogliamo rispondere: ripensateci. Riteniamo che siano solo voi stessi a porre alcune limitazioni a PHP. Potete spendere tutta la vita a passare da un linguaggio all'altro, cercando di trovare la combinazione ideale con le vostre esigenze, oppure potete iniziare a considerare i linguaggi come strumenti. I presunti difetti di un linguaggio come PHP possono in realt\u00e0 essere le ragioni del suo successo. E se lo unite a un altro linguaggio come Go, creerete prodotti molto pi\u00f9 potenti che se vi limitaste a usare un solo linguaggio.<\/p>\n<p>Dopo aver lavorato congiuntamente con Go e PHP, possiamo affermare di amarli. Non abbiamo intenzione di sacrificare uno a favore dell'altro: al contrario, cercheremo modi per estrarre ancora pi\u00f9 benefici da questo doppio stack.<\/p>\n<p><i>UPD: diamo il benvenuto al creatore di RoadRunner e co-autore dell'articolo originale \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Fonte: <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.1.1 - 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\/it\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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 non \u00e8 stato creato per morire, o Golang corre in soccorso | ProHoster","description":"Ciao, Habr!","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}