{"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\/es\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh","title":{"rendered":"RoadRunner: PHP no est\u00e1 hecho para morir, o Golang corre al rescate","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"RoadRunner: PHP no est\u00e1 hecho para morir, o Golang corre al rescate\" src=\"\/wp-content\/uploads\/2019\/06\/d2a69318cf25caa8fb49efedb333d7f8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00a1Hola, Habr! En Badoo estamos trabajando activamente <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/badoo\/blog\/430722\/\">en el rendimiento de PHP<\/a><\/noindex>, ya que tenemos un sistema bastante grande en este lenguaje y la cuesti\u00f3n del rendimiento es una cuesti\u00f3n de ahorro de dinero. Hace m\u00e1s de diez a\u00f1os creamos PHP-FPM para ello, que al principio consist\u00eda en un conjunto de parches para PHP y m\u00e1s tarde se incluy\u00f3 en la entrega oficial.<\/p>\n<p>En los \u00faltimos a\u00f1os, PHP ha avanzado considerablemente: el recolector de basura ha mejorado, se ha elevado el nivel de estabilidad: hoy en d\u00eda es posible escribir demonios y scripts de larga duraci\u00f3n en PHP sin mayores problemas. Esto ha permitido a Spiral Scout ir m\u00e1s all\u00e1: RoadRunner, a diferencia de PHP-FPM, no limpia la memoria entre solicitudes, lo que proporciona una ganancia adicional en rendimiento (aunque este enfoque complica el proceso de desarrollo). Actualmente estamos experimentando con esta herramienta, pero a\u00fan no tenemos resultados que compartir. Para hacer la espera m\u00e1s amena, <b>publicamos la traducci\u00f3n del anuncio de RoadRunner de Spiral Scout.<\/b><\/p>\n<p>El enfoque del art\u00edculo nos resulta cercano: al abordar nuestras tareas, tambi\u00e9n utilizamos con frecuencia la combinaci\u00f3n de PHP y Go, obteniendo ventajas de ambos lenguajes y sin renunciar a uno en favor del otro.<\/p>\n<p>\u00a1Disfruta!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>En los \u00faltimos diez a\u00f1os hemos creado aplicaciones tanto para empresas de la lista <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Fortune_Global_500\">Fortune 500<\/a><\/noindex>, como para negocios con una audiencia de no m\u00e1s de 500 usuarios. Durante todo este tiempo, nuestros ingenieros han desarrollado el backend principalmente en PHP. Pero hace dos a\u00f1os, algo afect\u00f3 no solo el rendimiento de nuestros productos, sino tambi\u00e9n su escalabilidad: incorporamos Golang (Go) a nuestro stack tecnol\u00f3gico.<\/p>\n<p>Casi de inmediato descubrimos que Go nos permite crear aplicaciones m\u00e1s grandes con un aumento de rendimiento de hasta 40 veces. Con \u00e9l, pudimos expandir los productos existentes desarrollados en PHP, mejor\u00e1ndolos gracias a la combinaci\u00f3n de las ventajas de ambos lenguajes.<\/p>\n<p>Contaremos c\u00f3mo la combinaci\u00f3n de Go y PHP ayuda a resolver problemas reales de desarrollo y c\u00f3mo se ha convertido en una herramienta capaz de aliviar parte de los problemas asociados con <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/post\/179399\/\">el modelo de 'muerte' de PHP<\/a><\/noindex>.<\/p>\n<h3>Su entorno cotidiano de desarrollo en PHP<\/h3>\n<p>\nAntes de hablar sobre c\u00f3mo Go puede revitalizar el modelo de 'muerte' de PHP, veamos su entorno est\u00e1ndar de desarrollo en PHP.<\/p>\n<p>En la mayor\u00eda de los casos, ejecutas la aplicaci\u00f3n mediante una combinaci\u00f3n del servidor web nginx y el servidor PHP-FPM. El primero se encarga de los archivos est\u00e1ticos y redirige las solicitudes espec\u00edficas a PHP-FPM, que a su vez ejecuta el c\u00f3digo PHP. Es posible que est\u00e9s utilizando una combinaci\u00f3n menos popular de Apache y mod_php. Pero aunque funciona de manera un poco diferente, los principios son los mismos.<\/p>\n<p>Veamos c\u00f3mo PHP-FPM ejecuta el c\u00f3digo de la aplicaci\u00f3n. Cuando llega una solicitud, PHP-FPM inicializa un proceso hijo de PHP y pasa los detalles de la solicitud como parte de su estado (_GET, _POST, _SERVER, etc.). <\/p>\n<p>El estado no puede cambiar durante la ejecuci\u00f3n del script PHP, por lo que solo puedes obtener un nuevo conjunto de datos de entrada de una manera: limpiando la memoria del proceso e inicializ\u00e1ndolo de nuevo.<\/p>\n<p>Este modelo de ejecuci\u00f3n tiene muchas ventajas. No necesitas preocuparte demasiado por el consumo de memoria, todos los procesos est\u00e1n completamente aislados, y si uno de ellos 'muere', se recrear\u00e1 autom\u00e1ticamente sin afectar a los dem\u00e1s procesos. Sin embargo, este enfoque tambi\u00e9n tiene desventajas que se hacen evidentes al intentar escalar la aplicaci\u00f3n.<\/p>\n<h3>Desventajas e ineficiencia del entorno PHP com\u00fan<\/h3>\n<p>\nSi te dedicas al desarrollo profesional en PHP, sabes que lo primero que debes hacer al iniciar un nuevo proyecto es elegir un marco. Este consiste en bibliotecas para inyecci\u00f3n de dependencias, ORM, traducciones y plantillas. Y, por supuesto, todos los datos de entrada del usuario se pueden convenientemente colocar en un solo objeto (Symfony\/HttpFoundation o PSR-7). \u00a1Los frameworks son geniales!<\/p>\n<p>Pero todo tiene su precio. En cualquier marco de nivel empresarial, para procesar una simple solicitud de usuario o realizar una consulta a la base de datos tendr\u00e1s que cargar, como m\u00ednimo, decenas de archivos, crear numerosas clases y analizar m\u00faltiples configuraciones. Pero lo peor es que tras cada tarea completada tendr\u00e1s que reiniciar todo: todo el c\u00f3digo que acabas de inicializar se vuelve in\u00fatil, ya no podr\u00e1s procesar otra solicitud con \u00e9l. Dile esto a cualquier programador que utilice otro lenguaje, y ver\u00e1s la incredulidad en su rostro.<\/p>\n<p>Los ingenieros de PHP han estado buscando durante a\u00f1os formas de solucionar este problema, utilizando t\u00e9cnicas bien pensadas de \"carga perezosa\", microframeworks, bibliotecas optimizadas, cach\u00e9, etc. Pero, al final, siempre terminan teniendo que reiniciar toda la aplicaci\u00f3n y comenzar de nuevo, una y otra vez.<i> (Nota del traductor: parte de este problema se resolver\u00e1 con la llegada de <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.php.net\/rfc\/preload\">preload<\/a><\/noindex> PHP 7.4)<\/p>\n<h3>\u00bfPuede PHP con Go manejar m\u00e1s de una solicitud?<\/h3>\n<p>\n<\/i>Se pueden escribir scripts de PHP que duren m\u00e1s que unos pocos minutos (hasta horas o d\u00edas): por ejemplo, tareas cron, analizadores de CSV, procesadores de colas. Todos ellos funcionan siguiendo un \u00fanico patr\u00f3n: extraen una tarea, la realizan, y esperan la siguiente. El c\u00f3digo permanece constantemente en memoria, ahorrando preciosos milisegundos, ya que se requiere realizar muchas acciones adicionales para cargar el framework y la aplicaci\u00f3n.<\/p>\n<p>Pero desarrollar scripts de larga duraci\u00f3n no es tan sencillo. Cualquier error destruye completamente el proceso, diagnosticar fugas de memoria vuelve loco, y ya no se puede usar la depuraci\u00f3n con F5.<\/p>\n<p>La situaci\u00f3n ha mejorado con el lanzamiento de PHP 7: ahora hay un recolector de basura confiable, es m\u00e1s f\u00e1cil manejar errores, y las extensiones del n\u00facleo est\u00e1n protegidas contra fugas. Sin embargo, los ingenieros a\u00fan deben tener cuidado con la memoria y estar atentos a los problemas de estado en el c\u00f3digo (\u00bfacaso existe un lenguaje en el que no haya que prestar atenci\u00f3n a estas cosas?). A\u00fan as\u00ed, en PHP 7 nos esperan menos sorpresas.<\/p>\n<p>\u00bfSe puede tomar el modelo de trabajo con scripts de PHP de larga duraci\u00f3n, adaptarlo a tareas m\u00e1s triviales como el procesamiento de solicitudes HTTP y as\u00ed eliminar la necesidad de cargar todo desde cero en cada solicitud?<\/p>\n<p>Para resolver esta tarea, primero era necesario implementar una aplicaci\u00f3n del lado del servidor capaz de recibir solicitudes HTTP y redirigirlas una por una a un trabajador de PHP, sin matarlo cada vez.<\/p>\n<p>Sab\u00edamos que podr\u00edamos escribir un servidor web en PHP puro (PHP-PM) o utilizando una extensi\u00f3n en C (Swoole). Y aunque cada m\u00e9todo tiene sus ventajas, ninguno de los dos nos satisfac\u00eda; quer\u00edamos algo m\u00e1s. Necesit\u00e1bamos no solo un servidor web, sino una soluci\u00f3n capaz de liberarnos de los problemas asociados con el 'arranque pesado' en PHP, que adem\u00e1s se pudiera adaptar y ampliar f\u00e1cilmente para aplicaciones espec\u00edficas. Es decir, necesit\u00e1bamos un servidor de aplicaciones.<\/p>\n<p>\u00bfPuede Go ayudar en esto? Sab\u00edamos que s\u00ed, porque este lenguaje compila aplicaciones en archivos binarios individuales; es multiplataforma; utiliza su propio y elegante modelo de concurrencia y una biblioteca para trabajar con HTTP; y, por \u00faltimo, tendr\u00edamos acceso a miles de bibliotecas e integraciones de c\u00f3digo abierto.<\/p>\n<h3>Dificultades de integrar dos lenguajes de programaci\u00f3n<\/h3>\n<p>\nEn primer lugar, era necesario definir c\u00f3mo se comunicar\u00edan entre s\u00ed dos o m\u00e1s aplicaciones.<\/p>\n<p>Por ejemplo, a trav\u00e9s de<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deuill\/go-php\"> una excelente biblioteca<\/a><\/noindex> de Alex Palastras que permit\u00eda la memoria compartida entre procesos PHP y Go (similar a mod_php en Apache). Pero esta biblioteca tiene particularidades que limitan su uso para resolver nuestra tarea.<\/p>\n<p>Decidimos utilizar otro enfoque, m\u00e1s com\u00fan: construir la interacci\u00f3n entre procesos a trav\u00e9s de sockets\/pipelines. Este enfoque ha demostrado su fiabilidad en las \u00faltimas d\u00e9cadas y ha sido bien optimizado a nivel del sistema operativo.<\/p>\n<p>Para comenzar, creamos un protocolo binario simple para el intercambio de datos entre procesos y el manejo de errores de transmisi\u00f3n. En su forma m\u00e1s simple, un protocolo de este tipo se asemeja 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 una cabecera de paquete de tama\u00f1o fijo<\/a><\/noindex> (en nuestro caso 17 bytes), que contiene informaci\u00f3n sobre el tipo de paquete, su tama\u00f1o y una m\u00e1scara binaria para verificar la integridad de los datos.<\/p>\n<p>En la parte de PHP utilizamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/php-src\/SocketRelay.php#L247\">la funci\u00f3n pack<\/a><\/noindex>, y en la parte de Go, la biblioteca<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/prefix.go\"> encoding\/binary<\/a><\/noindex>.<\/p>\n<p>Un solo protocolo nos pareci\u00f3 insuficiente, y a\u00f1adimos la capacidad de llamar a<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\/blob\/master\/codec.go\"> servicios Go net\/rpc directamente desde PHP<\/a><\/noindex>. M\u00e1s adelante, esto nos ayud\u00f3 mucho en el desarrollo, ya que pod\u00edamos integrar f\u00e1cilmente bibliotecas de Go en aplicaciones PHP. El resultado de este trabajo se puede ver, por ejemplo, en otro de nuestros productos de c\u00f3digo abierto<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/goridge\"> Goridge<\/a><\/noindex>.<\/p>\n<h3>Distribuci\u00f3n de tareas entre varios trabajadores PHP<\/h3>\n<p>\nDespu\u00e9s de implementar el mecanismo de interacci\u00f3n, comenzamos a pensar en c\u00f3mo transmitir tareas a los procesos PHP de la manera m\u00e1s eficiente. Cuando llega una tarea, el servidor de aplicaciones debe seleccionar un trabajador libre para su ejecuci\u00f3n. Si el trabajador\/proceso ha terminado con un error o \"ha fallado\", lo eliminamos y creamos uno nuevo en su lugar. Pero si el trabajador\/proceso ha completado su trabajo con \u00e9xito, lo devolvemos al grupo de trabajadores disponibles para realizar tareas.<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP no est\u00e1 hecho para morir, o Golang corre al rescate\" src=\"\/wp-content\/uploads\/2019\/06\/fe94ef304e0327247973ddd15723285a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara almacenar el grupo de trabajadores activos utilizamos<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/static_pool.go\"> canal bufferizado<\/a><\/noindex>, para eliminar de el grupo a los trabajadores \"muertos\" inesperadamente, a\u00f1adimos un mecanismo de seguimiento de errores y estados de los trabajadores.<\/p>\n<p>Como resultado, obtuvimos un servidor PHP operativo capaz de manejar cualquier solicitud presentada en formato binario.<\/p>\n<p>Para que nuestra aplicaci\u00f3n comenzara a funcionar como servidor web, tuvimos que elegir un est\u00e1ndar PHP confiable para representar cualquier solicitud HTTP entrante. En nuestro caso, simplemente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/blob\/master\/service\/http\/request.go\">convertimos<\/a><\/noindex> una solicitud net\/http de Go en el formato<noindex><a rel=\"nofollow\" href=\"https:\/\/www.php-fig.org\/psr\/psr-7\/meta\/\"> PSR-7<\/a><\/noindex>, para que fuera compatible con la mayor\u00eda de los frameworks PHP disponibles hoy en d\u00eda.<\/p>\n<p>Dado que PSR-7 se considera inmutable (alguien podr\u00eda decir que t\u00e9cnicamente no es as\u00ed), los desarrolladores deben escribir aplicaciones que, en principio, no manejan la solicitud como una entidad global. Esto combina muy bien con el concepto de procesos PHP de larga duraci\u00f3n. Nuestra implementaci\u00f3n final, que a\u00fan no ha recibido un nombre, se ve\u00eda as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"RoadRunner: PHP no est\u00e1 hecho para morir, o Golang corre al rescate\" src=\"\/wp-content\/uploads\/2019\/06\/e3a3a1af1925dfc60b7f8fd256d1ae11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Presentamos a RoadRunner \u2014<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> un servidor de aplicaciones PHP de alto rendimiento<\/a><\/noindex><\/h3>\n<p>\nNuestra primera tarea de prueba fue un backend API, en el que surgieron picos de solicitudes de forma impredecible (mucho m\u00e1s frecuentemente de lo habitual). Aunque en la mayor\u00eda de los casos las capacidades de nginx eran suficientes, nos enfrentamos regularmente al error 502, porque no pod\u00edamos equilibrar el sistema lo suficientemente r\u00e1pido ante el aumento esperado de carga.<\/p>\n<p>Para reemplazar esta soluci\u00f3n, a principios de 2018 desplegamos nuestro primer servidor de aplicaciones PHP\/Go. \u00a1Y obtuvimos un efecto incre\u00edble! No solo eliminamos completamente el error 502, sino que tambi\u00e9n logramos reducir el n\u00famero de servidores en dos tercios, ahorrando un mont\u00f3n de dinero y evitando dolores de cabeza para los ingenieros y gerentes de producto.<\/p>\n<p>A mediados de a\u00f1o, mejoramos nuestra soluci\u00f3n, la publicamos en GitHub bajo la licencia MIT y la llamamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\">RoadRunner<\/a><\/noindex>, destacando as\u00ed su incre\u00edble velocidad y eficiencia.<\/p>\n<h3>C\u00f3mo RoadRunner puede mejorar tu pila de desarrollo<\/h3>\n<p>\nAplicaci\u00f3n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\"> RoadRunner<\/a><\/noindex> nos permiti\u00f3 utilizar Middleware net\/http en el lado de Go para realizar la verificaci\u00f3n JWT incluso antes de que la solicitud llegue a PHP, as\u00ed como para manejar WebSockets y agregar estados globalmente en Prometheus. <\/p>\n<p>Gracias a la RPC incorporada, es posible abrir la API de cualquier biblioteca de Go para PHP sin necesidad de escribir extensiones envolventes. Lo que es a\u00fan m\u00e1s importante, con RoadRunner se pueden desplegar nuevos servidores que no son solo HTTP. Ejemplos incluyen lanzar en PHP controladores<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/roadrunner\/wiki\/AWS-Lambda\"> AWS Lambda<\/a><\/noindex>, crear parseadores de colas confiables e incluso agregar<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spiral\/php-grpc\"> gRPC<\/a><\/noindex> a nuestras aplicaciones.<\/p>\n<p>Con la ayuda de las comunidades de PHP y Go, hemos mejorado la estabilidad de la soluci\u00f3n, en algunas pruebas aumentamos el rendimiento de las aplicaciones hasta 40 veces, mejoramos las herramientas de depuraci\u00f3n, implementamos la integraci\u00f3n con el marco Symfony y a\u00f1adimos soporte para HTTPS, HTTP\/2, complementos y PSR-17.<\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>\nAlgunos todav\u00eda est\u00e1n atrapados en la antigua noci\u00f3n de PHP como un lenguaje lento y voluminoso, adecuado \u00fanicamente para escribir complementos para WordPress. Estas personas incluso pueden decir que PHP tiene una limitaci\u00f3n: cuando una aplicaci\u00f3n se vuelve lo suficientemente grande, hay que elegir un lenguaje m\u00e1s 'maduro' y reescribir la base de c\u00f3digo adquirida durante muchos a\u00f1os.<\/p>\n<p>Todo esto merece una respuesta: pi\u00e9nsalo de nuevo. Creemos que solo t\u00fa mismo estableces limitaciones para PHP. Puedes pasar toda tu vida cambiando de un lenguaje a otro, tratando de encontrar la combinaci\u00f3n perfecta para tus necesidades, o puedes comenzar a ver los lenguajes como herramientas. Las supuestas desventajas de un lenguaje como PHP en realidad pueden ser la raz\u00f3n de su \u00e9xito. Y si lo combinamos con otro lenguaje como Go, crear\u00e1s productos mucho m\u00e1s poderosos que si te limitaras a usar solo un lenguaje.<\/p>\n<p>Trabajando con la combinaci\u00f3n de Go y PHP, podemos afirmar que nos hemos enamorado de ellos. No planeamos sacrificar uno en favor del otro; al contrario, buscaremos formas de extraer a\u00fan m\u00e1s beneficios de esta doble pila.<\/p>\n<p><i>UPD: damos la bienvenida al creador de RoadRunner y coautor del art\u00edculo original \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/users\/lachezis\/\" class=\"user_link\">Lachezis<\/a><\/noindex><\/i><br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/badoo\/blog\/434272\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u044b \u0432 Badoo \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e PHP, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0434\u0435\u043d\u0435\u0433. \u0411\u043e\u043b\u0435\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e PHP-FPM, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0441\u043e\u0431\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0442\u0447\u0435\u0439 \u0434\u043b\u044f PHP, \u0430 \u043f\u043e\u0437\u0436\u0435 \u0432\u043e\u0448\u0451\u043b \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0443. \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0433\u043e\u0434\u044b PHP \u0441\u0438\u043b\u044c\u043d\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26762,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-35722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/roadrunner-php-ne-sozdan-chtoby-umirat-ili-golang-speshit-na-pomoshh\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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 no est\u00e1 destinado a morir, o Golang viene al rescate | ProHoster","description":"\u00a1Hola, Habr!","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/35722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=35722"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35722\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/26762"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}