{"id":53530,"date":"2019-12-04T00:00:00","date_gmt":"2019-12-03T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel"},"modified":"2020-02-18T14:01:26","modified_gmt":"2020-02-18T11:01:26","slug":"uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn el ecosistema PHP actualmente existen dos conectores para trabajar con el servidor Tarantool: la extensi\u00f3n oficial PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, escrita en C, y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, escrita en PHP. Yo soy el autor de esta \u00faltima.<\/p>\n<p>En este art\u00edculo me gustar\u00eda compartir los resultados de las pruebas de rendimiento de ambas bibliotecas y mostrar c\u00f3mo, con cambios m\u00ednimos en el c\u00f3digo, se puede lograr un aumento del 3-5 de rendimiento (<i>\u00a1en pruebas sint\u00e9ticas!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u00bfQu\u00e9 vamos a probar?<\/h2>\n<p>\nVamos a probar los mencionados anteriormente <i>conectores<\/i> sincr\u00f3nicos, ejecutados de manera as\u00edncrona, en paralelo y as\u00edncrono-paralelamente. \ud83d\ude42 Tambi\u00e9n no queremos tocar el c\u00f3digo de los propios conectores. Actualmente hay varias extensiones disponibles que permiten lograr lo deseado:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 un marco de trabajo as\u00edncrono de alto rendimiento para PHP. Utilizado por gigantes de internet como Alibaba y Baidu. A partir de la versi\u00f3n 4.1.0, se ha introducido el m\u00e9todo m\u00e1gico <i>SwooleRuntime::enableCoroutine()<\/i>, que permite \"con una l\u00ednea de c\u00f3digo transformar bibliotecas de red sincr\u00f3nicas en as\u00edncronas\".\n<\/li>\n<li>Async \u2015 hasta hace poco una extensi\u00f3n prometedora para trabajo as\u00edncrono en PHP. \u00bfPor qu\u00e9 hasta hace poco? Desafortunadamente, por razones que desconozco, el autor elimin\u00f3 el repositorio y el futuro del proyecto es incierto. Tendremos que utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">una<\/a><\/noindex> de forks. Al igual que Swoole, esta extensi\u00f3n permite con un simple movimiento convertir los pantalones para incluir asincron\u00eda reemplazando la implementaci\u00f3n est\u00e1ndar de TCP y TLS con sus versiones asincr\u00f3nicas. Esto se hace a trav\u00e9s de la opci\u00f3n &#171;<i>async.tcp = 1<\/i>\u00ab.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 una extensi\u00f3n bastante nueva del conocido Joe Watkins, autor de bibliotecas como phpdbg, apcu, pthreads, pcov, uopz. La extensi\u00f3n proporciona una API para trabajo multihilo en PHP y se posiciona como un reemplazo de pthreads. Una limitaci\u00f3n importante de la biblioteca es que solo funciona con versiones ZTS (Zend Thread Safe) de PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>\u00bfC\u00f3mo vamos a probar?<\/h2>\n<p>\nIniciaremos una instancia de Tarantool con el registro de escritura anticipada desactivado (<i>wal_mode = none<\/i>) y con un aumento del b\u00fafer de red (<i>readahead = 1 * 1024 * 1024<\/i>). La primera opci\u00f3n excluir\u00e1 el trabajo con disco, la segunda permitir\u00e1 leer m\u00e1s consultas del b\u00fafer del sistema operativo y as\u00ed minimizar el n\u00famero de llamadas al sistema.<\/p>\n<p>Para los benchmarks que trabajan con datos (inserci\u00f3n, eliminaci\u00f3n, lectura, etc.), antes de iniciar el benchmark se (re)crear\u00e1 el espacio memtx, donde los valores del \u00edndice primario son generados por un generador de valores enteros ordenados (secuencia).<br \/>\nEl aspecto del espacio DDL es el siguiente:<\/p>\n<pre><code class=\"lua\">space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})\nspace:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})\nspace:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})<\/code><\/pre>\n<p>\nDe ser necesario, antes de ejecutar el benchmark, el espacio se llena con 10,000 tuplas del tipo<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nEl acceso a las tuplas se realiza mediante un valor de clave aleatorio.<\/p>\n<p>El benchmark en s\u00ed es una sola consulta al servidor, que se ejecuta 10,000 veces (revoluciones), las cuales, a su vez, se ejecutan en iteraciones. Las iteraciones se repiten hasta que todas las desviaciones en el tiempo entre 5 iteraciones se encuentren dentro de un margen de error aceptable del 3 %*. Despu\u00e9s de eso, se toma el resultado promedio. Entre iteraciones hay una pausa de 1 segundo para evitar que el procesador entre en throttling. El recolector de basura de Lua se desactiva antes de cada iteraci\u00f3n y se inicia obligatoriamente despu\u00e9s de que se completa. El proceso de PHP se inicia solo con las extensiones necesarias para el benchmark, con la buffering de salida activada y desactivando el recolector de basura.<\/p>\n<p><i>* La cantidad de revoluciones, iteraciones y el umbral de error se pueden cambiar en la configuraci\u00f3n del benchmark.<\/i><\/p>\n<h2>Entorno de prueba<\/h2>\n<p>\nLos resultados publicados a continuaci\u00f3n se realizaron en un MacBookPro (2015), sistema operativo \u2014 Fedora 30 (versi\u00f3n del n\u00facleo 5.3.8-200.fc30.x86_64). Tarantool se ejecut\u00f3 en Docker con el par\u00e1metro &#171;<code>--network host\"<\/code>.<\/p>\n<p>Versiones de paquetes:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (compilado: 22 de octubre de 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ parche para 7.3)*<br \/>\next-msgpack: 2.0.3<br \/>\next-async: 0.3.0-8c1da46<br \/>\next-swoole: 4.4.12<br \/>\next-parallel: 1.1.3<\/p>\n<p>* <i>Desafortunadamente, el conector oficial no funciona con la versi\u00f3n de PHP &gt; 7.2. Para compilar y ejecutar la extensi\u00f3n en PHP 7.3, fue necesario utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">parche<\/a><\/noindex>.<\/i><\/p>\n<h2>Resultados<\/h2>\n<p><\/p>\n<h4>Modo sincr\u00f3nico<\/h4>\n<p>\nEl protocolo de Tarantool utiliza un formato binario <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> para la serializaci\u00f3n de mensajes. En el conector PECL, la serializaci\u00f3n est\u00e1 oculta profundamente en las entra\u00f1as de la biblioteca y no es posible influir en el proceso de codificaci\u00f3n desde el c\u00f3digo userland <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">.<\/a><\/noindex>. El conector en PHP puro, por otro lado, ofrece la posibilidad de personalizar el proceso de codificaci\u00f3n ampliando el codificador est\u00e1ndar o utilizando su propia implementaci\u00f3n. De forma predeterminada, hay dos codificadores disponibles, uno basado en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (la extensi\u00f3n oficial de MessagePack PECL), el otro en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (en PHP puro).<\/p>\n<p>Antes de comparar los conectores, evaluemos el rendimiento de los codificadores MessagePack para el conector PHP y en las siguientes pruebas utilizaremos aquel que muestre el mejor resultado:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAunque la versi\u00f3n PHP (Pure) es m\u00e1s lenta que la extensi\u00f3n PECL, en proyectos reales, a\u00fan recomendar\u00eda usar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, porque en la extensi\u00f3n oficial de MessagePack la especificaci\u00f3n del formato est\u00e1 implementada solo parcialmente (por ejemplo, no hay soporte para tipos de datos personalizados, sin los cuales no podr\u00e1s utilizar Decimal, un nuevo tipo de dato introducido en Tarantool 2.3) y presenta varios otros <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemas<\/a><\/noindex> (incluyendo problemas de compatibilidad con PHP 7.4). En general, el proyecto parece estar abandonado.<\/p>\n<p>As\u00ed que, midamos el rendimiento de los conectores en modo sincronizado:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo se puede ver en el gr\u00e1fico, el conector PECL (Tarantool) muestra un mejor rendimiento en comparaci\u00f3n con el conector de PHP (Client). Pero esto no es sorprendente, dado que el \u00faltimo, adem\u00e1s de estar implementado en un lenguaje m\u00e1s lento, realiza, en esencia, m\u00e1s trabajo: se crea un nuevo objeto en cada llamada <i>Request<\/i> y <i>Response<\/i> (en el caso de Select \u2015 tambi\u00e9n <i>Criteria<\/i>, y en el caso de Update\/Upsert \u2015 <i>Operations<\/i>), las entidades separadas <i>Connection<\/i>, <i>Packer <\/i>y <i>Handler<\/i> tambi\u00e9n a\u00f1aden sobrecarga. Es evidente que se paga un precio por la flexibilidad. Sin embargo, en general, el int\u00e9rprete PHP muestra un buen rendimiento; aunque hay diferencias, estas son poco significativas y, posiblemente, sean a\u00fan menores al utilizar preloading en PHP 7.4, sin mencionar JIT en PHP 8.<\/p>\n<p>Continuemos. En Tarantool 2.0 se introdujo soporte para SQL. Intentemos realizar operaciones Select, Insert, Update y Delete utilizando el protocolo SQL y comparar los resultados con sus equivalentes noSQL (binarios):<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLos resultados de SQL no son muy impresionantes (recuerden que a\u00fan estamos probando en modo sincronizado). Sin embargo, no me preocupar\u00eda demasiado por esto en este momento, el soporte para SQL todav\u00eda est\u00e1 en desarrollo activo (recientemente, por ejemplo, se agreg\u00f3 soporte para <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) y, seg\u00fan la lista <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, se esperan varias optimizaciones para el motor SQL en el futuro.<\/p>\n<h4>Async<\/h4>\n<p>\nVeamos ahora c\u00f3mo la extensi\u00f3n Async puede ayudarnos a mejorar los resultados anteriores. Para la escritura de programas as\u00edncronos, la extensi\u00f3n proporciona una API basada en corutinas, que es lo que utilizaremos. A trav\u00e9s de la experimentaci\u00f3n, descubrimos que el n\u00famero \u00f3ptimo de corutinas para nuestro entorno es 25:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDistribuimos 10,000 operaciones entre 25 corutinas y vemos qu\u00e9 resulta:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEl n\u00famero de operaciones por segundo ha crecido m\u00e1s de 3 veces para <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Es una pena, pero el conector PECL no se ejecut\u00f3 con ext-async.<\/p>\n<p>\u00bfY con SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo pueden ver, en modo as\u00edncrono la diferencia entre el protocolo binario y SQL queda dentro del margen de error.<\/p>\n<h4>Swoole<\/h4>\n<p>\nDe nuevo determinamos el n\u00famero \u00f3ptimo de corutinas, esta vez para Swoole:<br \/>\n<img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNos quedaremos en 25. Repitamos el mismo truco que con la extensi\u00f3n Async: distribuiremos 10,000 operaciones entre 25 corutinas. Adem\u00e1s, a\u00f1adiremos otra prueba en la que dividiremos todo el trabajo en 2 procesos (es decir, cada proceso realizar\u00e1 5,000 operaciones en 25 corutinas). Los procesos se crear\u00e1n utilizando <i>SwooleProcess<\/i>. <\/p>\n<p>Resultados:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole muestra un resultado ligeramente inferior en comparaci\u00f3n con Async al ejecutarse en un solo proceso, pero con 2 procesos la situaci\u00f3n cambia dr\u00e1sticamente (el n\u00famero 2 se eligi\u00f3 no al azar, en mi m\u00e1quina justamente 2 procesos mostraron el mejor resultado).<\/p>\n<p><i>Por cierto, la extensi\u00f3n Async tambi\u00e9n tiene API para trabajar con procesos, sin embargo, all\u00ed no not\u00e9 ninguna diferencia al ejecutar los benchmarks en uno o varios procesos (no se puede descartar que comet\u00ed un error en alg\u00fan lugar).<\/i><\/p>\n<p>SQL vs protocolo binario:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAl igual que con Async, la diferencia entre las operaciones binarias y SQL se nivela en modo as\u00edncrono.<\/p>\n<h4>Parallel<\/h4>\n<p>\nDado que la extensi\u00f3n Parallel no trata sobre corutinas, sino sobre hilos, midamos el n\u00famero \u00f3ptimo de hilos paralelos:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs de 16 en mi m\u00e1quina. Ejecutemos los benchmarks de los conectores en 16 hilos paralelos:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo pueden ver, el resultado es incluso mejor que con las extensiones as\u00edncronas (sin contar Swoole ejecutado en 2 procesos). Tengan en cuenta que para el conector PECL no hay operaciones en lugar de Update y Upsert. Esto se debe a que esas operaciones fallaron con un error; no s\u00e9 si es culpa de ext-parallel, ext-tarantool o de ambos.<\/p>\n<p>Ahora comparemos el rendimiento de SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00bfNotaron la similitud con el gr\u00e1fico de los conectores ejecutados de manera s\u00edncrona?<\/p>\n<h4>Todo junto<\/h4>\n<p>\nY para finalizar, resumamos todos los resultados en un solo gr\u00e1fico para ver el panorama general de las extensiones probadas. Solo agregaremos una nueva prueba al gr\u00e1fico, que a\u00fan no hemos realizado: ejecutaremos corrutinas Async en paralelo utilizando Parallel*. La idea de integrar las extensiones mencionadas anteriormente ya <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">ha sido discutida<\/a><\/noindex> por los autores, sin embargo, no se lleg\u00f3 a un consenso, as\u00ed que tendremos que hacerlo nosotros mismos. <\/p>\n<p><i>* No se pudo ejecutar corrutinas Swoole con Parallel; parece que estas extensiones son incompatibles.<\/i><\/p>\n<p>Entonces, los resultados finales:<\/p>\n<p><img decoding=\"async\" alt=\"Aceleramos los conectores PHP para Tarantool con Async, Swoole y Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>En conclusi\u00f3n<\/h2>\n<p>\nEn mi opini\u00f3n, los resultados son bastante impresionantes y tengo la extra\u00f1a sensaci\u00f3n de que \u00a1esto a\u00fan no es el l\u00edmite! Si esto es necesario para usted en un proyecto real, debe decidirlo exclusivamente usted mismo; solo dir\u00e9 que para m\u00ed fue un experimento interesante que me permiti\u00f3 evaluar cu\u00e1nto se puede \u2018exprimir\u2019 de un conector TCP sincr\u00f3nico con m\u00ednimos esfuerzos. Si tiene ideas para mejorar los benchmarks, estar\u00e9 encantado de considerar su pull request. Todo el c\u00f3digo con instrucciones para la ejecuci\u00f3n y resultados est\u00e1 publicado de forma separada <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">el repositorio<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478336\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53530","post","type-post","status-publish","format-standard","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=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.\" \/>\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\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\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\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\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-12-03T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:26+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\udd47Aceleramos los conectores PHP para Tarantool usando Async, Swoole y Parallel | ProHoster","description":"en el ecosistema PHP.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","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\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster","og:description":"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","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-12-03T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53530","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-24 07:46:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:23:55","updated":"2026-01-24 07:46:24","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\/53530","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=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}