{"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\/pt\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo ecossistema PHP, atualmente existem dois conectores para operar com o servidor Tarantool \u2013 \u00e9 a extens\u00e3o oficial PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, escrita em C, e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, escrita em PHP. Eu sou o autor da \u00faltima.<\/p>\n<p>Neste artigo, gostaria de compartilhar os resultados dos testes de desempenho de ambas as bibliotecas e mostrar como, com algumas mudan\u00e7as m\u00ednimas no c\u00f3digo, \u00e9 poss\u00edvel alcan\u00e7ar um aumento de 3 a 5% no desempenho (<i>em testes sint\u00e9ticos!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>O que vamos testar?<\/h2>\n<p>\nVamos testar os conectores mencionados acima <i>s\u00edncronos<\/i> conectores, executados de forma ass\u00edncrona, paralela e ass\u00edncrona-paralela. \ud83d\ude42 Tamb\u00e9m n\u00e3o queremos alterar o c\u00f3digo dos pr\u00f3prios conectores. Atualmente, existem algumas extens\u00f5es dispon\u00edveis que permitem alcan\u00e7ar o desejado:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2013 um framework ass\u00edncrono de alto desempenho para PHP. \u00c9 utilizado por gigantes da internet como Alibaba e Baidu. Desde a vers\u00e3o 4.1.0, apareceu o m\u00e9todo m\u00e1gico <i>SwooleRuntime::enableCoroutine()<\/i>, permitindo \"com uma linha de c\u00f3digo converter bibliotecas de rede s\u00edncronas PHP em ass\u00edncronas\".\n<\/li>\n<li>Async \u2013 at\u00e9 recentemente, uma extens\u00e3o bastante promissora para trabalho ass\u00edncrono em PHP. Por que at\u00e9 recentemente? Infelizmente, por uma raz\u00e3o que eu desconhe\u00e7o, o autor deletou o reposit\u00f3rio e o futuro do projeto \u00e9 incerto. Teremos que usar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">uma<\/a><\/noindex> dos forks. Assim como o Swoole, esta extens\u00e3o permite, com um simples movimento, transformar as configura\u00e7\u00f5es de TCP e TLS substituindo suas implementa\u00e7\u00f5es padr\u00e3o pelas vers\u00f5es ass\u00edncronas. Isso \u00e9 feito atrav\u00e9s da op\u00e7\u00e3o &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2013 uma extens\u00e3o bastante nova do famoso Joe Watkins, autor de bibliotecas como phpdbg, apcu, pthreads, pcov, uopz. A extens\u00e3o fornece uma API para trabalho multithread em PHP e \u00e9 posicionada como uma substitui\u00e7\u00e3o para pthreads. Uma limita\u00e7\u00e3o significativa da biblioteca \u00e9 que ela funciona apenas com a vers\u00e3o ZTS (Zend Thread Safe) do PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Como vamos testar?<\/h2>\n<p>\nVamos iniciar uma inst\u00e2ncia do Tarantool com o log de escrita antecipada desativado (<i>wal_mode = none<\/i>) e um buffer de rede aumentado (<i>readahead = 1 * 1024 * 1024<\/i>). A primeira op\u00e7\u00e3o eliminar\u00e1 o trabalho com o disco, a segunda \u2013 permitir\u00e1 ler mais solicita\u00e7\u00f5es do buffer do sistema operacional, minimizando assim o n\u00famero de chamadas de sistema.<\/p>\n<p>Para benchmarks que lidam com dados (inser\u00e7\u00e3o, exclus\u00e3o, leitura etc.), antes de iniciar o benchmark ser\u00e1 (re)criado um espa\u00e7o memtx, onde os valores do \u00edndice prim\u00e1rio s\u00e3o gerados por um gerador de valores inteiros ordenados (sequence).<br \/>\nO DDL do espa\u00e7o \u00e9 assim:<\/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>\nSe necess\u00e1rio, antes de iniciar o benchmark, o espa\u00e7o \u00e9 preenchido com 10.000 tuplas do tipo<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nO acesso \u00e0s tuplas \u00e9 feito por um valor de chave aleat\u00f3ria.<\/p>\n<p>O pr\u00f3prio benchmark consiste em uma \u00fanica solicita\u00e7\u00e3o ao servidor, que \u00e9 executada 10.000 vezes (revolu\u00e7\u00f5es), que, por sua vez, s\u00e3o realizadas em itera\u00e7\u00f5es. As itera\u00e7\u00f5es s\u00e3o repetidas at\u00e9 que todas as varia\u00e7\u00f5es de tempo entre 5 itera\u00e7\u00f5es estejam dentro da margem de erro aceit\u00e1vel de 3%*. Ap\u00f3s isso, o resultado m\u00e9dio \u00e9 tomado. Entre as itera\u00e7\u00f5es, h\u00e1 uma pausa de 1 segundo, para n\u00e3o permitir que o processador entre em throttling. O coletor de lixo do Lua \u00e9 desligado antes de cada itera\u00e7\u00e3o e \u00e9 for\u00e7ado a ser acionado ap\u00f3s sua conclus\u00e3o. O processo PHP \u00e9 iniciado apenas com as extens\u00f5es necess\u00e1rias para o benchmark, com buffer de sa\u00edda ativado e coletor de lixo desativado.<\/p>\n<p><i>* O n\u00famero de revolu\u00e7\u00f5es, itera\u00e7\u00f5es e o limite de erro podem ser alterados nas configura\u00e7\u00f5es do benchmark.<\/i><\/p>\n<h2>Ambiente de teste<\/h2>\n<p>\nOs resultados publicados abaixo foram obtidos em um MacBook Pro (2015), sistema operacional \u2014 Fedora 30 (vers\u00e3o do kernel 5.3.8-200.fc30.x86_64). O Tarantool foi executado no Docker com o par\u00e2metro &#171;<code>--network host\"<\/code>.<\/p>\n<p>Vers\u00f5es dos pacotes:<\/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 outubro de 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch 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>Infelizmente, o conector oficial n\u00e3o funciona com a vers\u00e3o do PHP &gt; 7.2. Para compilar e executar a extens\u00e3o no PHP 7.3, foi necess\u00e1rio usar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">, desativando a a\u00e7\u00e3o de escape da barra invertida, se estiver no final da linha.<\/a><\/noindex>.<\/i><\/p>\n<h2>Resultados<\/h2>\n<p><\/p>\n<h4>Modo s\u00edncrono<\/h4>\n<p>\nO protocolo do Tarantool usa formato bin\u00e1rio <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> para serializar mensagens. No conector PECL, a serializa\u00e7\u00e3o est\u00e1 profundamente escondida nas profundezas da biblioteca e n\u00e3o \u00e9 poss\u00edvel influenciar o processo de codifica\u00e7\u00e3o a partir do c\u00f3digo userland <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">o que n\u00e3o \u00e9 vi\u00e1vel.<\/a><\/noindex>. O conector em PHP puro, por outro lado, oferece a possibilidade de personalizar o processo de codifica\u00e7\u00e3o expandindo o codificador padr\u00e3o ou utilizando a pr\u00f3pria implementa\u00e7\u00e3o. Por padr\u00e3o, est\u00e3o dispon\u00edveis dois codificadores, um baseado em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (extens\u00e3o oficial do MessagePack PECL), o outro \u00e9 baseado em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (em PHP puro).<\/p>\n<p>Antes de comparar os conectores, vamos medir o desempenho dos codificadores MessagePack para o conector PHP e, nos testes futuros, utilizaremos aquele que mostrar o melhor resultado:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEmbora a vers\u00e3o PHP (Pura) seja mais lenta que a extens\u00e3o PECL, em projetos reais eu ainda recomendaria utilizar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, pois na extens\u00e3o oficial do MessagePack a especifica\u00e7\u00e3o do formato est\u00e1 implementada apenas parcialmente (por exemplo, n\u00e3o h\u00e1 suporte para tipos de dados personalizados, sem os quais voc\u00ea n\u00e3o poder\u00e1 usar Decimal \u2014 um novo tipo de dado apresentado no Tarantool 2.3) e possui uma s\u00e9rie de outras <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemas<\/a><\/noindex> (incluindo problemas de compatibilidade com PHP 7.4). Al\u00e9m disso, o projeto, de forma geral, parece estar abandonado.<\/p>\n<p>Ent\u00e3o, vamos medir o desempenho dos conectores em modo s\u00edncrono:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo pode ser visto no gr\u00e1fico, o conector PECL (Tarantool) apresenta melhor desempenho em compara\u00e7\u00e3o com o conector em PHP (Client). Mas isso n\u00e3o \u00e9 surpresa, considerando que o \u00faltimo, al\u00e9m de ser implementado em uma linguagem mais lenta, realiza, na verdade, mais trabalho: a cada chamada, um novo objeto \u00e9 criado <i>Request<\/i> e <i>Response<\/i> (no caso de Select \u2015 ainda <i>Crit\u00e9rios<\/i>, e no caso de Update\/Upsert \u2015 <i>Opera\u00e7\u00f5es<\/i>), entidades separadas <i>Conex\u00e3o<\/i>, <i>Packer <\/i>e <i>Handler<\/i> tamb\u00e9m acrescentam sobrecarga. \u00c9 evidente que a flexibilidade tem seu custo. No entanto, de forma geral, o interpretador PHP mostra um bom desempenho, embora haja diferen\u00e7a, mas ela \u00e9 insignificante e talvez ser\u00e1 ainda menor com o uso de preloading no PHP 7.4, sem mencionar o JIT no PHP 8.<\/p>\n<p>Vamos em frente. No Tarantool 2.0 foi adicionado suporte ao SQL. Vamos tentar executar opera\u00e7\u00f5es Select, Insert, Update e Delete usando o protocolo SQL e comparar os resultados com os equivalentes no noSQL (bin\u00e1rios):<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOs resultados do SQL n\u00e3o s\u00e3o muito impressionantes (lembrando que ainda estamos testando o modo s\u00edncrono). No entanto, eu n\u00e3o me preocuparia com isso antes do tempo, pois o suporte ao SQL ainda est\u00e1 em desenvolvimento ativo (relativamente recentemente, por exemplo, foi adicionada a suporte a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">declara\u00e7\u00f5es preparadas<\/a><\/noindex>) e, judging pela lista <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, o mecanismo SQL aguarda v\u00e1rias otimiza\u00e7\u00f5es no futuro.<\/p>\n<h4>Ass\u00edncrono<\/h4>\n<p>\nBem, vamos ver agora como a extens\u00e3o Async pode nos ajudar a melhorar os resultados acima. Para a programa\u00e7\u00e3o ass\u00edncrona, a extens\u00e3o fornece uma API baseada em corrotinas, que usaremos. Atrav\u00e9s de experi\u00eancia pr\u00e1tica, descobrimos que a quantidade ideal de corrotinas para o nosso ambiente \u00e9 25:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDistribu\u00edmos 10.000 opera\u00e7\u00f5es entre 25 corrotinas e vemos o que conseguimos:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO n\u00famero de opera\u00e7\u00f5es por segundo aumentou mais de 3 vezes para <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Infelizmente, o conector PECL n\u00e3o iniciou com ext-async.<\/p>\n<p>E quanto ao SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo voc\u00eas podem ver, no modo ass\u00edncrono, a diferen\u00e7a entre o protocolo bin\u00e1rio e o SQL tornou-se dentro da margem de erro.<\/p>\n<h4>Swoole<\/h4>\n<p>\nNovamente, descobrimos a quantidade ideal de corrotinas, agora para o Swoole:<br \/>\n<img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVamos ficar com 25. Faremos o mesmo truque que com a extens\u00e3o Async - distribuiremos 10.000 opera\u00e7\u00f5es entre 25 corrotinas. Al\u00e9m disso, adicionaremos mais um teste, no qual dividiremos todo o trabalho em 2 processos (ou seja, cada processo executar\u00e1 5.000 opera\u00e7\u00f5es em 25 corrotinas). Os processos ser\u00e3o criados utilizando <i>SwooleProcess<\/i>. <\/p>\n<p>Resultados:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO Swoole mostra um resultado ligeiramente inferior em compara\u00e7\u00e3o com o Async quando executado em um \u00fanico processo, mas com 2 processos a situa\u00e7\u00e3o muda radicalmente (o n\u00famero 2 foi escolhido n\u00e3o por acaso, na minha m\u00e1quina, exatamente 2 processos mostraram o melhor resultado).<\/p>\n<p><i>Ali\u00e1s, na extens\u00e3o Async tamb\u00e9m h\u00e1 uma API para trabalhar com processos, no entanto, n\u00e3o percebi nenhuma diferen\u00e7a ao executar benchmarks em um ou v\u00e1rios processos (n\u00e3o posso descartar a possibilidade de algum erro da minha parte).<\/i><\/p>\n<p>SQL vs protocolo bin\u00e1rio:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAssim como com o Async, a diferen\u00e7a entre as opera\u00e7\u00f5es bin\u00e1rias e SQL \u00e9 neutralizada no modo ass\u00edncrono.<\/p>\n<h4>Parallel<\/h4>\n<p>\nComo a extens\u00e3o Parallel n\u00e3o se trata de corrotinas, mas de threads, vamos medir a quantidade ideal de threads paralelas:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEla \u00e9 igual a 16 na minha m\u00e1quina. Vamos executar os benchmarks dos conectores em 16 threads paralelas:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComo podem ver, o resultado \u00e9 ainda melhor do que com as extens\u00f5es ass\u00edncronas (exceto o Swoole executado em 2 processos). Observe que para o conector PECL, na parte de opera\u00e7\u00f5es Update e Upsert, est\u00e1 vazio. Isso se deve ao fato de que essas opera\u00e7\u00f5es falharam com erro - n\u00e3o sei se por causa do ext-parallel, ext-tarantool ou ambos.<\/p>\n<p>Agora, vamos comparar o desempenho do SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNotou alguma semelhan\u00e7a com o gr\u00e1fico para os conectores executados de forma s\u00edncrona?<\/p>\n<h4>Tudo junto<\/h4>\n<p>\nPor fim, vamos reunir todos os resultados em um \u00fanico gr\u00e1fico para ver a imagem geral das extens\u00f5es testadas. Adicionaremos ao gr\u00e1fico apenas um novo teste que ainda n\u00e3o fizemos - iremos executar corrotinas Async em paralelo usando Parallel*. A ideia de integrar as extens\u00f5es mencionadas acima j\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">foi discutida<\/a><\/noindex> pelos autores, mas um consenso ainda n\u00e3o foi alcan\u00e7ado, teremos que fazer isso sozinhos. <\/p>\n<p><i>* N\u00e3o conseguimos executar corrotinas Swoole com Parallel; parece que essas extens\u00f5es s\u00e3o incompat\u00edveis.<\/i><\/p>\n<p>Ent\u00e3o, os resultados finais:<\/p>\n<p><img decoding=\"async\" alt=\"Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Em conclus\u00e3o<\/h2>\n<p>\nNa minha opini\u00e3o, os resultados s\u00e3o bastante impressionantes, e por algum motivo estou convencido de que isso ainda n\u00e3o \u00e9 o limite! Cabe a voc\u00eas decidir se isso \u00e9 necess\u00e1rio em um projeto real, apenas direi que para mim foi um experimento interessante, permitindo avaliar o quanto pode ser \"extra\u00eddo\" de um conector TCP s\u00edncrono com o m\u00ednimo de esfor\u00e7o. Se voc\u00ea tiver ideias para melhorar os benchmarks - ficarei feliz em considerar seu pull request. Todo o c\u00f3digo com instru\u00e7\u00f5es de execu\u00e7\u00e3o e resultados foi publicado em um <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">reposit\u00f3rio<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\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\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\/pt\/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\udd47Acelerando conectores PHP para Tarantool com Async, Swoole e Parallel | ProHoster","description":"No ecossistema PHP.","canonical_url":"https:\/\/prohoster.info\/pt\/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":"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\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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/53530","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=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}