{"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\/pt\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP n\u00e3o foi criado para morrer, ou Golang vem em socorro","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP n\u00e3o foi criado para morrer, ou Golang vem em socorro\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOl\u00e1, Habr! N\u00f3s no Badoo estamos ativamente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">trabalhando na performance do PHP<\/a><\/noindex>, uma vez que temos um sistema grande nesta linguagem e a quest\u00e3o da performance \u00e9 uma quest\u00e3o de economia. Mais de dez anos atr\u00e1s, criamos o PHP-FPM, que inicialmente era um conjunto de patches para PHP e depois integrou a vers\u00e3o oficial.<\/p>\n<p>Nos \u00faltimos anos, o PHP avan\u00e7ou muito: o coletor de lixo melhorou, o n\u00edvel de estabilidade aumentou - hoje \u00e9 poss\u00edvel escrever demons e scripts de longa dura\u00e7\u00e3o em PHP sem muitos problemas. Isso permitiu que a Spiral Scout fosse mais al\u00e9m: RoadRunner, ao contr\u00e1rio do PHP-FPM, n\u00e3o limpa a mem\u00f3ria entre as requisi\u00e7\u00f5es, proporcionando um ganho adicional em performance (embora essa abordagem complique o processo de desenvolvimento). Estamos experimentando essa ferramenta, mas ainda n\u00e3o temos resultados para compartilhar. Para tornar a espera mais divertida, <b>publicamos a tradu\u00e7\u00e3o do an\u00fancio do RoadRunner da Spiral Scout.<\/b><\/p>\n<p>A abordagem do artigo ressoa conosco: ao resolver nossos problemas, tamb\u00e9m usamos frequentemente a combina\u00e7\u00e3o de PHP e Go, obtendo benef\u00edcios de ambas as linguagens sem abrir m\u00e3o de uma em favor da outra.<\/p>\n<p>Aproveite!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Nos \u00faltimos dez anos, criamos aplicativos tanto para empresas da lista <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, quanto para neg\u00f3cios com uma audi\u00eancia de n\u00e3o mais que 500 usu\u00e1rios. Durante todo esse tempo, nossos engenheiros desenvolveram o backend predominantemente em PHP. Mas h\u00e1 dois anos, algo teve um grande impacto n\u00e3o s\u00f3 na performance de nossos produtos, mas tamb\u00e9m na escalabilidade deles - introduzimos o Golang (Go) em nossa pilha tecnol\u00f3gica.<\/p>\n<p>Quase imediatamente, descobrimos que Go nos permite criar aplicativos maiores com um aumento de performance de at\u00e9 40 vezes. Com ele, conseguimos expandir produtos existentes escritos em PHP, melhorando-os com a combina\u00e7\u00e3o de vantagens de ambas as linguagens.<\/p>\n<p>Vamos falar sobre como a combina\u00e7\u00e3o de Go e PHP ajuda a resolver problemas reais de desenvolvimento e como se tornou uma ferramenta capaz de aliviar alguns problemas relacionados ao <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">modelo \u2018morrendo\u2019 do PHP<\/a><\/noindex>.<\/p>\n<h3>Seu ambiente di\u00e1rio de desenvolvimento PHP<\/h3>\n<p>\nAntes de falar sobre como o Go pode reviver o modelo 'morrendo' do PHP, vamos olhar para o seu ambiente padr\u00e3o de desenvolvimento PHP.<\/p>\n<p>Na maioria dos casos, voc\u00ea executa o aplicativo usando uma combina\u00e7\u00e3o do servidor web nginx e do servidor PHP-FPM. O primeiro gerencia arquivos est\u00e1ticos e redireciona solicita\u00e7\u00f5es espec\u00edficas para o PHP-FPM, que por sua vez executa o c\u00f3digo PHP. Talvez voc\u00ea esteja usando uma combina\u00e7\u00e3o menos comum do Apache com mod_php. Mas, embora funcione de maneira um pouco diferente, os princ\u00edpios s\u00e3o os mesmos.<\/p>\n<p>Vamos considerar como o PHP-FPM executa o c\u00f3digo do aplicativo. Quando chega uma solicita\u00e7\u00e3o, o PHP-FPM inicializa um processo PHP filho e transmite os detalhes da solicita\u00e7\u00e3o como parte de seu estado (_GET, _POST, _SERVER, etc.). <\/p>\n<p>O estado n\u00e3o pode mudar durante a execu\u00e7\u00e3o do script PHP, portanto, para obter um novo conjunto de dados de entrada, h\u00e1 apenas uma maneira: limpando a mem\u00f3ria do processo e inicializando-o novamente.<\/p>\n<p>Esse modelo de execu\u00e7\u00e3o tem muitas vantagens. Voc\u00ea n\u00e3o precisa se preocupar muito com o consumo de mem\u00f3ria, todos os processos s\u00e3o totalmente isolados, e se um deles \"morrer\", ele ser\u00e1 automaticamente recriado, o que n\u00e3o afetar\u00e1 os outros processos. Mas esse m\u00e9todo tamb\u00e9m tem desvantagens, que se tornam evidentes ao tentar escalar o aplicativo.<\/p>\n<h3>Desvantagens e inefici\u00eancias do ambiente PHP convencional<\/h3>\n<p>\nSe voc\u00ea \u00e9 um desenvolvedor PHP profissional, sabe por onde come\u00e7ar um novo projeto - pela escolha do framework. Ele consiste em bibliotecas para inje\u00e7\u00e3o de depend\u00eancia, ORMs, tradu\u00e7\u00f5es e templates. E, claro, todos os dados de entrada do usu\u00e1rio podem ser facilmente agrupados em um \u00fanico objeto (Symfony\/HttpFoundation ou PSR-7). Frameworks s\u00e3o incr\u00edveis!<\/p>\n<p>Mas tudo tem seu pre\u00e7o. Em qualquer framework de n\u00edvel empresarial, para lidar com uma simples solicita\u00e7\u00e3o de usu\u00e1rio ou chamada ao banco de dados, voc\u00ea ter\u00e1 que carregar pelo menos dezenas de arquivos, criar v\u00e1rias classes e analisar v\u00e1rias configura\u00e7\u00f5es. Mas o pior de tudo \u00e9 que, ap\u00f3s a execu\u00e7\u00e3o de cada tarefa, voc\u00ea precisar\u00e1 reiniciar tudo: todo o c\u00f3digo que voc\u00ea acabou de inicializar se torna in\u00fatil, e com ele voc\u00ea n\u00e3o pode mais processar outra solicita\u00e7\u00e3o. Diga isso a qualquer programador que escreve em outra linguagem, e voc\u00ea ver\u00e1 a confus\u00e3o em seu rosto.<\/p>\n<p>Engenheiros PHP buscaram maneiras de resolver esse problema por anos, utilizando metodologias pensadas de 'lazy' loading, micro frameworks, bibliotecas otimizadas, cache, etc. Mas, no final das contas, ainda \u00e9 necess\u00e1rio reiniciar toda a aplica\u00e7\u00e3o e recome\u00e7ar, repetidamente.<i> (Nota do tradutor: parte desse problema ser\u00e1 resolvida com a chegada do <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> no PHP 7.4)<\/p>\n<h3>O PHP pode, com a ajuda do Go, lidar com mais de uma solicita\u00e7\u00e3o?<\/h3>\n<p>\n<\/i>\u00c9 poss\u00edvel escrever scripts PHP que durem mais do que alguns minutos (at\u00e9 horas ou dias): por exemplo, tarefas cron, parsers de CSV, processadores de filas. Todos funcionam de maneira semelhante: extraem uma tarefa, executam-na, aguardam a pr\u00f3xima. O c\u00f3digo permanece na mem\u00f3ria, economizando preciosos milissegundos, pois carregar frameworks e aplica\u00e7\u00f5es exige muitas a\u00e7\u00f5es adicionais.<\/p>\n<p>Por\u00e9m, desenvolver scripts de longa dura\u00e7\u00e3o n\u00e3o \u00e9 t\u00e3o simples. Qualquer erro mata completamente o processo, o diagn\u00f3stico de vazamentos de mem\u00f3ria \u00e9 irritante, e n\u00e3o \u00e9 mais poss\u00edvel usar o debug do F5.<\/p>\n<p>A situa\u00e7\u00e3o melhorou com o lan\u00e7amento do PHP 7: um coletor de lixo confi\u00e1vel foi introduzido, o tratamento de erros ficou mais f\u00e1cil, e as extens\u00f5es do n\u00facleo agora est\u00e3o protegidas contra vazamentos. No entanto, os engenheiros ainda precisam manusear a mem\u00f3ria com cuidado e lembrar dos problemas de estado no c\u00f3digo (existe alguma linguagem onde isso n\u00e3o seja uma preocupa\u00e7\u00e3o?). Ainda assim, no PHP 7, encontramos menos surpresas.<\/p>\n<p>\u00c9 poss\u00edvel pegar o modelo de trabalho com scripts PHP de longa dura\u00e7\u00e3o, adapt\u00e1-lo para tarefas mais triviais como o tratamento de solicita\u00e7\u00f5es HTTP, e assim eliminar a necessidade de carregar tudo novamente a cada solicita\u00e7\u00e3o?<\/p>\n<p>Para resolver essa tarefa, primeiro era necess\u00e1rio implementar uma aplica\u00e7\u00e3o servidor que pudesse aceitar solicita\u00e7\u00f5es HTTP e redirecion\u00e1-las uma a uma para o trabalhador PHP, sem encerr\u00e1-lo a cada vez.<\/p>\n<p>Sab\u00edamos que poder\u00edamos criar um servidor web em PHP puro (PHP-PM) ou usando uma extens\u00e3o em C (Swoole). E embora cada m\u00e9todo tenha suas vantagens, nenhuma das op\u00e7\u00f5es nos satisfazia \u2014 quer\u00edamos algo mais. Precis\u00e1vamos n\u00e3o apenas de um servidor web \u2014 esper\u00e1vamos uma solu\u00e7\u00e3o capaz de nos livrar dos problemas relacionados ao 'alto custo de inicializa\u00e7\u00e3o' em PHP, que ao mesmo tempo pudesse ser facilmente adaptada e expandida para aplica\u00e7\u00f5es espec\u00edficas. Ou seja, precis\u00e1vamos de um servidor de aplicativos.<\/p>\n<p>O Go pode ajudar nisso? Sab\u00edamos que sim, porque essa linguagem compila aplicativos em arquivos bin\u00e1rios \u00fanicos; \u00e9 multiplataforma; usa um modelo de concorr\u00eancia muito elegante e uma biblioteca para trabalho com HTTP; e, finalmente, teremos acesso a milhares de bibliotecas e integra\u00e7\u00f5es open-source.<\/p>\n<h3>Dificuldades em combinar duas linguagens de programa\u00e7\u00e3o<\/h3>\n<p>\nPrimeiro, era necess\u00e1rio definir como dois ou mais aplicativos se comunicariam uns com os outros.<\/p>\n<p>Por exemplo, usando<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> uma \u00f3tima biblioteca<\/a><\/noindex> de Alex Paleytress, era poss\u00edvel implementar o compartilhamento de mem\u00f3ria entre os processos PHP e Go (semelhante ao mod_php no Apache). Mas essa biblioteca possui caracter\u00edsticas que limitam seu uso para resolver nossa tarefa.<\/p>\n<p>Decidimos usar uma abordagem diferente e mais comum: construir a intera\u00e7\u00e3o entre processos atrav\u00e9s de sockets\/pipes. Essa abordagem se mostrou confi\u00e1vel nas \u00faltimas d\u00e9cadas e foi bem otimizada no n\u00edvel do sistema operacional.<\/p>\n<p>Primeiro, criamos um protocolo bin\u00e1rio simples para troca de dados entre processos e tratamento de erros de transmiss\u00e3o. Em sua forma mais simples, um protocolo desse tipo \u00e9 semelhante a <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Netstring\">netstring<\/a><\/noindex> com<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> com um cabe\u00e7alho de pacote de tamanho fixo<\/a><\/noindex> (no nosso caso, 17 bytes), que cont\u00e9m informa\u00e7\u00f5es sobre o tipo de pacote, seu tamanho e uma m\u00e1scara bin\u00e1ria para verifica\u00e7\u00e3o da integridade dos dados.<\/p>\n<p>Do lado do PHP, usamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">a fun\u00e7\u00e3o pack<\/a><\/noindex>, enquanto no lado do Go \u2014 a biblioteca<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Achamos que apenas um protocolo n\u00e3o era suficiente \u2014 e adicionamos a possibilidade de invocar<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> servi\u00e7os Go net\/rpc diretamente do PHP<\/a><\/noindex>. Mais tarde, isso nos ajudou muito no desenvolvimento, pois pudemos integrar facilmente bibliotecas Go em aplicativos PHP. O resultado desse trabalho pode ser visto, por exemplo, em outro de nossos produtos open-source<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Distribui\u00e7\u00e3o de tarefas entre v\u00e1rios PHP workers<\/h3>\n<p>\nAp\u00f3s a implementa\u00e7\u00e3o do mecanismo de intera\u00e7\u00e3o, come\u00e7amos a pensar na forma mais eficiente de passar tarefas para processos PHP. Quando uma tarefa chega, o servidor de aplica\u00e7\u00f5es deve selecionar um worker livre para execut\u00e1-la. Se o worker\/processo finalizou com erro ou \u2018morreu\u2019, n\u00f3s o removemos e criamos um novo em seu lugar. Se o worker\/processo foi bem-sucedido, o devolvemos ao pool de workers dispon\u00edveis para tarefas.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP n\u00e3o foi criado para morrer, ou Golang vem em socorro\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara armazenar o pool de workers ativos, utilizamos<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> um canal bufferizado<\/a><\/noindex>, e para eliminar workers que inesperadamente \u2018morreram\u2019, adicionamos um mecanismo de monitoramento de erros e estados dos workers.<\/p>\n<p>Como resultado, obtivemos um servidor PHP funcional, capaz de processar quaisquer solicita\u00e7\u00f5es apresentadas em formato bin\u00e1rio.<\/p>\n<p>Para que nossa aplica\u00e7\u00e3o come\u00e7asse a funcionar como um servidor web, foi necess\u00e1rio escolher um padr\u00e3o PHP confi\u00e1vel para representar quaisquer solicita\u00e7\u00f5es HTTP recebidas. No nosso caso, n\u00f3s apenas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">convertamos<\/a><\/noindex> a solicita\u00e7\u00e3o net\/http de Go para o formato<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, a fim de garantir compatibilidade com a maioria dos frameworks PHP dispon\u00edveis atualmente.<\/p>\n<p>Como o PSR-7 \u00e9 considerado imut\u00e1vel (algu\u00e9m diria que tecnicamente n\u00e3o \u00e9), os desenvolvedores precisam escrever aplica\u00e7\u00f5es que, em princ\u00edpio, n\u00e3o tratam a solicita\u00e7\u00e3o como uma entidade global. Isso combina perfeitamente com a ideia de processos PHP de longa dura\u00e7\u00e3o. Nossa implementa\u00e7\u00e3o final, que ainda n\u00e3o recebeu um nome, foi a seguinte:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP n\u00e3o foi criado para morrer, ou Golang vem em socorro\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Apresentamos o RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> um servidor PHP de aplica\u00e7\u00f5es de alto desempenho<\/a><\/noindex><\/h3>\n<p>\nNossa primeira tarefa de teste foi um backend de API, no qual picos de solicita\u00e7\u00f5es surgiam periodicamente de forma imprevis\u00edvel (muito mais frequentemente do que o normal). Embora nas maiores partes dos casos as capacidades do nginx fossem suficientes, frequentemente encontramos o erro 502, pois n\u00e3o consegu\u00edamos balancear o sistema rapidamente o suficiente para o aumento esperado da carga.<\/p>\n<p>Para substituir essa solu\u00e7\u00e3o, no in\u00edcio de 2018, implementamos nosso primeiro servidor de aplica\u00e7\u00f5es PHP\/Go. E imediatamente obtivemos um efeito incr\u00edvel! N\u00e3o apenas eliminamos completamente o erro 502, como tamb\u00e9m conseguimos reduzir em dois ter\u00e7os o n\u00famero de servidores, economizando uma fortuna e evitando dores de cabe\u00e7a para engenheiros e gerentes de produtos.<\/p>\n<p>No meio do ano, aprimoramos nossa solu\u00e7\u00e3o, publicamos no GitHub sob a licen\u00e7a MIT e a chamamos de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, destacando assim sua incr\u00edvel velocidade e efici\u00eancia.<\/p>\n<h3>Como o RoadRunner pode melhorar seu stack de desenvolvimento<\/h3>\n<p>\nAplica\u00e7\u00e3o<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> nos permitiu utilizar Middleware net\/http no Go para realizar a verifica\u00e7\u00e3o JWT antes que a solicita\u00e7\u00e3o chegue ao PHP, al\u00e9m de gerenciar WebSockets e agregar estados globalmente no Prometheus. <\/p>\n<p>Com o RPC embutido, \u00e9 poss\u00edvel abrir APIs de quaisquer bibliotecas Go para PHP sem a necessidade de escrever extens\u00f5es wrapper. O que \u00e9 ainda mais importante, com o RoadRunner \u00e9 poss\u00edvel implantar novos servidores que n\u00e3o s\u00e3o baseados em HTTP. Exemplos incluem a execu\u00e7\u00e3o de manipuladores em PHP<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, cria\u00e7\u00e3o de analisadores de filas confi\u00e1veis e at\u00e9 mesmo a adi\u00e7\u00e3o de<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> em nossas aplica\u00e7\u00f5es.<\/p>\n<p>Com as comunidades PHP e Go, aumentamos a estabilidade da solu\u00e7\u00e3o, em alguns testes aumentamos o desempenho das aplica\u00e7\u00f5es em at\u00e9 40 vezes, aprimoramos as ferramentas de depura\u00e7\u00e3o, implementamos a integra\u00e7\u00e3o com o framework Symfony e adicionamos suporte a HTTPS, HTTP\/2, plugins e PSR-17.<\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>\nAlguns ainda est\u00e3o presos \u00e0 ideia ultrapassada de que PHP \u00e9 uma linguagem lenta e pesada, adequada apenas para escrita de plugins para WordPress. Essas pessoas podem at\u00e9 dizer que o PHP tem uma limita\u00e7\u00e3o: quando a aplica\u00e7\u00e3o se torna grande o suficiente, \u00e9 necess\u00e1rio escolher uma linguagem mais 'madura' e reescrever a base de c\u00f3digo acumulada ao longo de muitos anos.<\/p>\n<p>A isso, gostar\u00edamos de responder: pense novamente. Acreditamos que apenas voc\u00ea mesmo imp\u00f5e algumas limita\u00e7\u00f5es ao PHP. Voc\u00ea pode passar a vida toda alternando de uma linguagem para outra, tentando encontrar a combina\u00e7\u00e3o perfeita para suas necessidades, ou pode come\u00e7ar a ver as linguagens como ferramentas. Supostos defeitos da linguagem como o PHP podem, na verdade, ser as raz\u00f5es para seu sucesso. E, se voc\u00ea combin\u00e1-la com outra linguagem como Go, criar\u00e1 produtos muito mais poderosos do que se ficasse limitado ao uso de uma \u00fanica linguagem.<\/p>\n<p>Trabalhando com a combina\u00e7\u00e3o de Go e PHP, podemos afirmar que nos apaixonamos por ambas. N\u00e3o planejamos sacrificar uma em favor da outra \u2014 ao contr\u00e1rio, estaremos em busca de maneiras de extrair ainda mais benef\u00edcios desse stack duplo.<\/p>\n<p><i>UPD: damos as boas-vindas ao criador do RoadRunner e co-autor do artigo original \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.3 - 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\/pt\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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 n\u00e3o foi feito para morrer, ou o Golang corre em aux\u00edlio | ProHoster","description":"Ol\u00e1, Habr!","canonical_url":"https:\/\/prohoster.info\/pt\/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":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}