{"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, oppure 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, oppure Golang corre in aiuto\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCiao, Habr! In Badoo stiamo attivamente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">lavorando sulle performance di PHP<\/a><\/noindex>, dato che abbiamo un sistema piuttosto grande su questo linguaggio e il tema 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, ma successivamente \u00e8 stato incluso nella distribuzione ufficiale.<\/p>\n<p>Negli ultimi anni PHP ha fatto grandi progressi: il garbage collector \u00e8 migliorato, la stabilit\u00e0 \u00e8 aumentata \u2014 oggi \u00e8 possibile scrivere demoni e script a lungo termine senza troppi problemi. Questo ha permesso a Spiral Scout di andare oltre: RoadRunner, a differenza di PHP-FPM, non libera la memoria tra le richieste, offrendo quindi un guadagno ulteriore in termini di prestazioni (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 interessante, <b>pubblichiamo la traduzione dell'annuncio di RoadRunner da Spiral Scout.<\/b><\/p>\n<p>L'approccio descritto nell'articolo ci \u00e8 vicino: per risolvere i nostri problemi utilizziamo spesso la combinazione di PHP e Go, ottenendo vantaggi da entrambe le lingue senza dover rinunciare a una in favore dell'altra.<\/p>\n<p>Buon divertimento!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Negli ultimi dieci anni abbiamo sviluppato 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 attivit\u00e0 con un pubblico di non pi\u00f9 di 500 utenti. Durante tutto questo tempo i nostri ingegneri hanno principalmente sviluppato il backend in PHP. Ma due anni fa qualcosa ha avuto un impatto significativo, 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 subito abbiamo scoperto che Go ci permette di creare applicazioni pi\u00f9 grandi con un aumento delle performance fino a 40 volte. Grazie a esso, siamo riusciti a espandere i prodotti esistenti scritti in PHP, migliorandoli grazie alla combinazione dei vantaggi di entrambi i linguaggi.<\/p>\n<p>Vi parleremo di come la combinazione di Go e PHP aiuta a risolvere problemi reali di sviluppo e come sia diventata per noi uno strumento in grado di alleviare alcune problematiche legate a <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">un modello di \"morte\" di PHP<\/a><\/noindex>.<\/p>\n<h3>Il vostro ambiente quotidiano di sviluppo PHP<\/h3>\n<p>\nPrima di discutere come Go pu\u00f2 rivitalizzare il modello di \"morte\" di PHP, daremo un'occhiata al vostro standard ambiente di sviluppo PHP.<\/p>\n<p>Nella maggior parte dei casi, eseguite l\u2019applicazione utilizzando una combinazione di server web nginx e il server PHP-FPM. Il primo gestisce i file statici e reindirizza le richieste specifiche a PHP-FPM, mentre quest'ultimo esegue il codice PHP. Potreste utilizzare una combinazione meno popolare di Apache e mod_php. Anche se funziona in modo leggermente diverso, i principi sono gli stessi.<\/p>\n<p>Esaminiamo 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, pertanto \u00e8 possibile ottenere un nuovo set di dati di input solo in un modo: liberando la memoria del processo e inizializzandolo nuovamente.<\/p>\n<p>Questo modello di esecuzione ha molti vantaggi. Non dovete preoccuparvi eccessivamente del consumo di memoria, tutti i processi sono completamente isolati e se uno di essi \"muore\", verr\u00e0 ricreato automaticamente, senza influenzare gli altri processi. Tuttavia, questa metodologia ha anche degli svantaggi, che emergono nel tentativo di scalare l'applicazione.<\/p>\n<h3>Svantaggi e inefficienza dell'ambiente PHP standard<\/h3>\n<p>\nSe siete impegnati nello sviluppo professionale con PHP, saprete da dove iniziare un nuovo progetto: dalla scelta del framework. Questo rappresenta librerie per la gestione delle dipendenze, ORM, traduzioni e template. E naturalmente, tutti i dati di input degli utenti possono essere comodamente racchiusi in un singolo oggetto (Symfony\/HttpFoundation o PSR-7). I framework sono fantastici!<\/p>\n<p>Ma tutto ha un prezzo. In qualsiasi framework di livello enterprise, per gestire una semplice richiesta dell'utente o una chiamata al database, dovrete caricare almeno una dozzina di file, creare molteplici classi e analizzare varie configurazioni. Ma la cosa peggiore \u00e8 che dopo ogni compito completato, dovrete azzerare tutto e ricominciare: tutto il codice che avete appena inizializzato diventa inutile, e non potete pi\u00f9 gestire un'altra richiesta con esso. Racconta questo a qualsiasi programmatore che utilizza un altro linguaggio, e vedrete stupore sul suo volto.<\/p>\n<p>Gli ingegneri PHP hanno cercato per anni di trovare soluzioni a questo problema, utilizzando metodologie ben ponderate di \"lazy\" loading, microframework, librerie ottimizzate, caching, ecc. Ma alla fine ci si trova sempre a dover azzerare l'intera applicazione e a ricominciare da capo, di nuovo e di nuovo.<i> (Nota del traduttore: parte di questo problema sar\u00e0 risolta con l'arrivo di <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> PHP 7.4)<\/p>\n<h3>PHP pu\u00f2 gestire pi\u00f9 di una richiesta con Go?<\/h3>\n<p>\n<\/i>\u00c8 possibile scrivere script PHP che vivono pi\u00f9 di pochi minuti (fino a ore o giorni): ad esempio, compiti cron, parser CSV, gestori di code. Tutti seguono uno stesso schema: estraggono il compito, lo eseguono, aspettano il successivo. Il codice rimane costantemente in memoria, risparmiando preziosi millisecondi poich\u00e9 il caricamento del framework e dell'applicazione richiede numerosi passaggi aggiuntivi.<\/p>\n<p>Tuttavia, sviluppare script a lungo termine non \u00e8 cos\u00ec semplice. Qualsiasi errore uccide completamente il processo, diagnosticare perdite di memoria \u00e8 frustrante e non \u00e8 pi\u00f9 possibile utilizzare il debug con F5.<\/p>\n<p>La situazione \u00e8 migliorata con l'uscita di PHP 7: \u00e8 stato introdotto un collettore di rifiuti affidabile, \u00e8 pi\u00f9 facile gestire gli errori e le estensioni del core ora sono protette dalle perdite. Tuttavia, gli ingegneri devono ancora trattare la memoria con cautela e tenere a mente i problemi di stato nel codice (esiste un linguaggio dove non \u00e8 necessario prestare attenzione a queste cose?). Eppure, in PHP 7 ci sono meno sorprese.<\/p>\n<p>\u00c8 possibile prendere il modello di funzionamento degli script PHP a lungo termine, adattarlo a compiti pi\u00f9 banali come l'elaborazione di richieste HTTP e, in tal modo, eliminare la necessit\u00e0 di caricare tutto da zero ad ogni richiesta?<\/p>\n<p>Per affrontare questo compito, era necessario implementare un'applicazione server in grado di ricevere richieste HTTP e reindirizzarle una dopo l'altra a un lavoratore PHP, senza ucciderlo ogni volta.<\/p>\n<p>Sapevamo di poter scrivere un server web in puro PHP (PHP-PM) o utilizzando un'estensione C (Swoole). Sebbene entrambe le soluzioni avessero i loro vantaggi, nessuna delle due ci soddisfaceva completamente: volevamo qualcosa di pi\u00f9. Non avevamo bisogno solo di un server web, ma cercavamo una soluzione capace di liberaci dai problemi di 'caricamento pesante' in PHP, facilmente adattabile e scalabile per applicazioni specifiche. Quindi, avevamo bisogno di un server di applicazioni.<\/p>\n<p>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 elegante modello di concorrenza e una libreria per lavorare con HTTP; e, infine, avremmo avuto accesso a migliaia di librerie open-source e integrazioni.<\/p>\n<h3>Difficolt\u00e0 nell'integrare due linguaggi di programmazione<\/h3>\n<p>\nPrima di tutto, dovevamo definire come sarebbero comunicati due o pi\u00f9 applicazioni tra loro.<\/p>\n<p>Ad esempio, utilizzando<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> una fantastica libreria<\/a><\/noindex> di Alex Paleytras si potrebbe realizzare una condivisione di memoria tra processi PHP e Go (simile a mod_php in Apache). Ma questa libreria ha delle limitazioni che ne restringono l'applicabilit\u00e0 alla nostra soluzione.<\/p>\n<p>Abbiamo deciso di utilizzare un approccio diverso, pi\u00f9 comune: costruire l'interazione tra i processi attraverso socket\/pipeline. Questo approccio ha dimostrato la sua affidabilit\u00e0 e ottimizzazione a livello di sistema operativo negli ultimi decenni.<\/p>\n<p>Per iniziare, abbiamo creato un protocollo binario semplice per lo scambio di dati tra 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\"> un pacchetto di intestazione di dimensioni fisse<\/a><\/noindex> (nel nostro caso 17 byte), che contiene informazioni sul tipo di pacchetto, le sue dimensioni e una maschera binaria per il controllo dell'integrit\u00e0 dei dati.<\/p>\n<p>Dalla parte 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>, mentre dalla parte Go abbiamo utilizzato la libreria<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Un solo protocollo ci \u00e8 sembrato troppo limitante \u2014 e abbiamo aggiunto la possibilit\u00e0 di invocare<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> servizi Go net\/rpc direttamente da PHP.<\/a><\/noindex>In seguito, questo ci ha molto aiutato nello sviluppo poich\u00e9 abbiamo potuto integrare facilmente le librerie Go nelle applicazioni PHP. Il risultato di questo lavoro \u00e8 visibile, ad esempio, nel nostro altro prodotto open-source<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Distribuzione dei compiti tra diversi lavoratori PHP<\/h3>\n<p>\nDopo aver implementato il meccanismo di interazione, abbiamo iniziato a pensare a come trasmettere compiti ai processi PHP in modo pi\u00f9 efficiente. Quando arriva un compito, il server delle applicazioni deve scegliere un lavoratore libero per eseguirlo. Se il lavoratore\/processo ha terminato il lavoro con un errore o \u00e8 'morto', lo eliminiamo e ne creiamo uno nuovo in cambio. E se il lavoratore\/processo \u00e8 stato completato con successo, lo restituiamo al pool di lavoratori disponibili per eseguire compiti.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP non \u00e8 stato creato per morire, oppure 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 lavoratori 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 dal pool i lavoratori 'morti' inaspettatamente, abbiamo aggiunto un meccanismo per monitorare errori e stati dei lavoratori.<\/p>\n<p>Di conseguenza, abbiamo ottenuto un server PHP funzionante in grado di gestire qualsiasi richiesta presentata in formato binario.<\/p>\n<p>Affinch\u00e9 la nostra applicazione iniziasse a funzionare come server web, \u00e8 stato necessario scegliere uno standard PHP affidabile per la rappresentazione di qualsiasi richiesta HTTP in entrata. Nel nostro caso, semplicemente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">convertiamo<\/a><\/noindex> net\/http request da Go in 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 (qualcuno dir\u00e0 che tecnicamente non \u00e8 cos\u00ec), agli sviluppatori \u00e8 richiesto di scrivere applicazioni che in linea di principio non trattano la richiesta come un'entit\u00e0 globale. Questo si abbina perfettamente al concetto di processi PHP a lungo termine. 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, oppure 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 prova \u00e8 stato un backend API, in cui si sono verificati picchi di richieste in modo imprevedibile (molto pi\u00f9 frequentemente del solito). Anche se nella maggior parte dei casi le capacit\u00e0 di nginx erano sufficienti, ci siamo frequentemente imbattuti nell'errore 502, perch\u00e9 non riuscivamo a bilanciare il sistema abbastanza rapidamente per supportare l'aumento previsto del carico.<\/p>\n<p>Per sostituire questa soluzione, all'inizio del 2018 abbiamo distribuito il nostro primo server PHP\/Go per applicazioni. E subito abbiamo ottenuto un effetto straordinario! Non solo ci siamo liberati completamente dell'errore 502, ma siamo anche riusciti a ridurre il numero di server di due terzi, risparmiando un sacco di soldi e riducendo la necessit\u00e0 di antidolorifici per ingegneri e manager di prodotto.<\/p>\n<p>Entro la met\u00e0 dell'anno abbiamo perfezionato la nostra soluzione, l'abbiamo pubblicata su GitHub con licenza MIT e l'abbiamo chiamata <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 sul lato Go per effettuare la verifica JWT prima che la richiesta raggiunga PHP, oltre a gestire i WebSocket e aggregare globalmente gli stati in Prometheus. <\/p>\n<p>Grazie al RPC integrato, \u00e8 possibile aprire API di qualsiasi libreria Go per PHP senza dover scrivere wrapper di estensione. Anche pi\u00f9 importante, con RoadRunner \u00e8 possibile distribuire nuovi server che differiscono da HTTP. Esempi di ci\u00f2 includono l'esecuzione di handler in PHP, la creazione di parser di code affidabili e persino l'aggiunta<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>alle nostre applicazioni.<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> Con il supporto delle comunit\u00e0 PHP e Go, abbiamo aumentato la stabilit\u00e0 della soluzione, in alcuni test abbiamo aumentato le prestazioni delle applicazioni fino a 40 volte, abbiamo perfezionato gli strumenti di debug, implementato l'integrazione con il framework Symfony e aggiunto supporto per HTTPS, HTTP\/2, plugin e PSR-17.<\/p>\n<p>Alcuni sono ancora prigionieri di una visione obsoleta di PHP come un linguaggio lento e ingombrante, adatto solo per la scrittura di plugin per WordPress. Queste persone potrebbero persino dire che PHP ha un limite: quando l'applicazione diventa abbastanza grande, \u00e8 necessario scegliere un linguaggio pi\u00f9 'maturo' e riscrivere il codice accumulato nel corso degli anni.<\/p>\n<h3>Conclusione<\/h3>\n<p>\nA tutto ci\u00f2 vorrei rispondere: ripensaci. Crediamo che solo tu stessi imponendo limiti a PHP. Puoi trascorrere tutta la vita a passare da un linguaggio all'altro cercando la combinazione ideale per le tue esigenze, oppure puoi iniziare a considerare i linguaggi come strumenti. Apparenti svantaggi di un linguaggio come PHP possono in realt\u00e0 essere le ragioni del suo successo. E se lo unisci a un altro linguaggio come Go, creerai prodotti molto pi\u00f9 potenti di quanto faresti limitandoti a utilizzare un solo linguaggio.<\/p>\n<p>Dopo aver lavorato con la combinazione di Go e PHP, possiamo affermare di amarli. Non abbiamo intenzione di sacrificare uno per l'altro: al contrario, cercheremo modi per trarre ancor pi\u00f9 vantaggio da questo stack doppio.<\/p>\n<p>UPD: diamo il benvenuto al creatore di RoadRunner e coautore dell'articolo originale \u2014<\/p>\n<p><i>Lachezis <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Ciao, Habr! Noi di Badoo lavoriamo attivamente per migliorare le prestazioni di PHP, poich\u00e9 abbiamo un sistema abbastanza grande in questo linguaggio e la questione delle prestazioni \u00e8 una questione di risparmio. Oltre dieci anni fa abbiamo creato PHP-FPM, che inizialmente era un insieme di patch per PHP, e in seguito \u00e8 stato incluso nella distribuzione ufficiale. Negli ultimi anni, PHP \u00e8 molto cambiato.<\/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.0.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.0.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 nato per morire, o Golang corre in aiuto | 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}]}}