{"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\/sl\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV PHP ekosistemu trenutno postoje dva konektora za rad sa Tarantool serverom - to je slu\u017ebena PECL ekstenzija <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, napisana na C, i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, napisana na PHP. Ja sam autor ove druge.<\/p>\n<p>U ovom \u010dlanku \u017eelim podeliti rezultate testiranja performansi oba biblioteke i pokazati kako uz minimalne izmene u kodu mo\u017eemo posti\u0107i pove\u0107anje performansi od 3-5% (<i>na sinteti\u010dkim testovima!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u0160ta \u0107emo testirati?<\/h2>\n<p>\nTestira\u0107emo gore pomenute <i>sinkrone<\/i> konektore pokrenute asinhrono, paralelno i asinhrono-paralelno. \ud83d\ude42 Tako\u0111e ne \u017eelimo dirati kod samih konektora. Trenutno je dostupno nekoliko ekstenzija koje omogu\u0107avaju postizanje \u017eeljenog:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 visokoperformantni asinhroni okvir za PHP. Koriste ga internet divovi kao \u0161to su Alibaba i Baidu. Od verzije 4.1.0 uvedena je \u010darobna metoda <i>SwooleRuntime::enableCoroutine()<\/i>, koja omogu\u0107ava \u201ejednom linijom koda da pretvori sinkrone mre\u017ene biblioteke PHP u asinhrone\u201d.\n<\/li>\n<li>Async \u2015 do nedavno veoma perspektivna ekstenzija za asinhroni rad u PHP. Za\u0161to do nedavno? Na\u017ealost, iz meni nepoznatih razloga, autor je obrisao repozitorijum, a dalja sudbina projekta je nejasna. Mora\u0107emo da koristimo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">jedan<\/a><\/noindex> iz forkov. Tako kot Swoole, to raz\u0161iritev omogo\u010da enostavno preoblikovanje hla\u010d v vklopite asinhronost z zamenjavo standardne implementacije TCP in TLS tokov z njihovimi asinhronimi razli\u010dicami. To se dose\u017ee z mo\u017enostjo &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 prili\u010dno nova ekstenzija od poznatog Joe Watkins-a, autora biblioteka kao \u0161to su phpdbg, apcu, pthreads, pcov, uopz. Ekstenzija pru\u017ea API za multi-thread rad u PHP i pozicionira se kao zamena za pthreads. zna\u010dajno ograni\u010denje biblioteke je to \u0161to radi samo sa ZTS (Zend Thread Safe) verzijom PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kako \u0107emo testirati?<\/h2>\n<p>\nZagnali bomo instanco Tarantoola z izklju\u010denim dnevnikom predpomnjenja (<i>wal_mode = none<\/i>) i pove\u0107anim mre\u017enim baferom (<i>readahead = 1 * 1024 * 1024<\/i>). Prva opcija isklju\u010duje rad sa diskom, dok druga omogu\u0107ava da se vi\u0161e zahteva \u010dita iz bafera operativnog sistema i time minimizuje broj sistemskih poziva.<\/p>\n<p>Za benchmarke, ki delujejo z podatki (vstavljanje, brisanje, branje itd.), se pred za\u010detkom benchmarka (pre)ustvari memtx-prostor, v katerem vrednosti primarnega indeksa ustvarja generator urejenih celih \u0161tevil (sekvenca).<br \/>\nDDL prostora izgleda tako:<\/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>\nPo potrebi, pred zagonem benchmarka, se prostor napolni z 10.000 tupli v obliki<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nDostop do tuple se izvaja preko naklju\u010dne vrednosti klju\u010da.<\/p>\n<p>Sam benchmark predstavlja en sam zahtevek stre\u017eniku, ki se izvede 10.000-krat (revolucij), ki se, za redom, izvajajo v iteracijah. Iteracije se ponavljajo, dokler vse odstopanja v \u010dasu med 5 iteracijami ne bodo v okviru dopustnega odklona 3 %*. Po tem se vzame povpre\u010den rezultat. Med iteracijami je premor 1 sekundo, da se procesor ne prepusti throttlingu. Zbiralnik odpadkov Lua se izklopi pred vsakim iteracijo in se prisilno za\u017eene po njenem zaklju\u010dku. PHP-postopek se za\u017eene le z nujnimi raz\u0161iritvami za benchmark, z vklopljeno predpomnilnikom izhoda in izklopljenim zbiralnikom odpadkov.<\/p>\n<p><i>* \u0160tevilo revolucij, iteracij in prag napake je mogo\u010de spremeniti v nastavitvah benchmarka.<\/i><\/p>\n<h2>Testno okolje<\/h2>\n<p>\nObjavljeni spodnji rezultati so bili pridobljeni na MacBookPro (2015), operacijski sistem - Fedora 30 (razli\u010dica jedra 5.3.8-200.fc30.x86_64). Tarantool je bil zagnan v Dockerju z mo\u017enostjo &#171;<code>--network host\"<\/code>.<\/p>\n<p>Razli\u010dice paketov:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (zgrajen: 22. okt 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch za 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>\u017dal, uradni konektor ne deluje z razli\u010dico PHP &gt; 7.2. Da bi lahko sestavili in zagnali raz\u0161iritev na PHP 7.3, je bilo treba uporabiti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patchom<\/a><\/noindex>.<\/i><\/p>\n<h2>Rezultati<\/h2>\n<p><\/p>\n<h4>Sinhroni na\u010din<\/h4>\n<p>\nProtokol Tarantoola uporablja binarno obliko <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> za serializacijo sporo\u010dil. V konektorju PECL je serializacija globoko skrita v nedrih knji\u017enice in vplivati na postopek kodiranja iz userland-kode <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">ni mogo\u010de.<\/a><\/noindex>. PHP Connector, nasprotno, omogo\u010da prilagoditev procesa kodiranja z raz\u0161iritvijo standardnega kodirnika ali mo\u017enostjo uporabe lastne implementacije. Izklju\u010deno sta na voljo dva kodirnika, eden temelji na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (uradna raz\u0161iritev MessagePack PECL), drugi pa na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (v \u010distem PHP).<\/p>\n<p>Pred primerjavo konektorjev bomo izmerili zmogljivost MessagePack kodirnikov za PHP konektor in v nadaljnjih testih bomo uporabili tistega, ki bo pokazal najbolj\u0161e rezultate:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u010ceprav PHP razli\u010dica (Pure) zaostaja za PECL raz\u0161iritvijo po hitrosti, bi kljub temu v realnih projektih priporo\u010dil uporabo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, ker uradna raz\u0161iritev MessagePack implementira specifikacijo formata le delno (na primer, ne podpira uporabni\u0161kih tipov podatkov, brez katerih ne boste mogli uporabljati Decimal \u2014 novega tipa podatkov, predstavljenega v Tarantool 2.3) in ima vrsto drugih <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">probl\u00e9mech<\/a><\/noindex> (vklju\u010dno s te\u017eavami s zdru\u017eljivostjo s PHP 7.4). Na splo\u0161no pa projekt deluje zapostavljeno.<\/p>\n<p>Torej, izmerimo zmogljivost konektorjev v sinhronem na\u010dinu:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKot je razvidno iz grafa, PECL konektor (Tarantool) ka\u017ee bolj\u0161o zmogljivost v primerjavi s PHP konektorjem (Client). A to ni presenetljivo, \u010de upo\u0161tevamo, da ta, poleg tega, da je implementiran v po\u010dasnej\u0161em jeziku, izvaja tudi ve\u010d dela: pri vsakem klicu se ustvari nov objekt <i>Request<\/i> in <i>Odgovor<\/i> (v primeru Select \u2014 \u0161e tudi <i>Criteria<\/i>, medtem ko v primeru Update\/Upsert \u2014 <i>Operations<\/i>), posamezne entitete <i>Povezava<\/i>, <i>Packer <\/i>in <i>Handler<\/i> tudi dodajajo ovire. O\u010ditno je, da za prilagodljivost pla\u010damo. Vendar pa na splo\u0161no PHP interpreter ka\u017ee dobro zmogljivost, \u010deprav razlika obstaja, a je zanemarljiva in bo morda \u0161e manj\u0161a pri uporabi preloading v PHP 7.4, da ne omenjam JIT v PHP 8.<\/p>\n<p>Nadaljujemo. V Tarantool 2.0 je pri\u0161la podpora za SQL. Poskusimo izvesti operacije Select, Insert, Update in Delete z uporabo SQL protokola in primerjati rezultate z noSQL (binarno) ekvivalenti:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRezultati SQL niso preve\u010d impresivni (spomnim vas, da \u0161e vedno testiramo sinhroni na\u010din). Vendar pa se ne bi smel prehitro obupati, saj je podpora za SQL \u0161e vedno v aktivnem razvoju (pred kratkim, na primer, je bila dodana podpora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) in, soditi po seznamu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL engine is expected to undergo a series of optimizations.<\/p>\n<h4>Async<\/h4>\n<p>\nWell, let's see how the Async extension can help us improve the above results. To write asynchronous programs, the extension provides an API based on coroutines, which we will use. Through experimentation, we find that the optimal number of coroutines for our environment is 25:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWe will \"spread out\" 10,000 operations across 25 coroutines and see what we get:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe number of operations per second has increased more than 3 times for <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Unfortunately, the PECL connector did not start with ext-async.<\/p>\n<p>And what about SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs you can see, in asynchronous mode, the difference between the binary protocol and SQL is within the margin of error.<\/p>\n<h4>Swoole<\/h4>\n<p>\nAgain, we discover the optimal number of coroutines, this time for Swoole:<br \/>\n<img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWe will stick to 25. We'll repeat the same trick as with the Async extension \u2014 distributing 10,000 operations across 25 coroutines. In addition, we'll add another test where we divide all the work into 2 processes (meaning each process will execute 5,000 operations in 25 coroutines). The processes will be created using <i>SwooleProcess<\/i>. <\/p>\n<p>Rezultati:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole shows a slightly lower result compared to Async when running in a single process, but with 2 processes, the picture changes dramatically (the number 2 is not chosen randomly; on my machine, exactly 2 processes showed the best result).<\/p>\n<p><i>By the way, the Async extension also has an API for working with processes, but I did not notice any difference in running benchmarks in one or several processes (it's possible that I messed something up).<\/i><\/p>\n<p>SQL vs binary protocol:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJust like with Async, the difference between binary and SQL operations is leveling out in asynchronous mode.<\/p>\n<h4>Parallel<\/h4>\n<p>\nSince the Parallel extension is not about coroutines but about threads, let's measure the optimal number of parallel threads:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIt's 16 on my machine. Let's run connector benchmarks with 16 parallel threads:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs you can see, the result is even better than with asynchronous extensions (except for Swoole running on 2 processes). Note that for the PECL connector, there is nothing in the update and upsert operations. This is related to the fact that these operations failed with an error \u2014 I do not know whether it was due to ext-parallel, ext-tarantool, or both.<\/p>\n<p>Now let's compare SQL performance:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNotice the similarity with the graphs for connectors running synchronously?<\/p>\n<h4>All together<\/h4>\n<p>\nIn the end, let's compile all the results into a single graph to see the overall picture for the tested extensions. We will add just one new test to the graph that we haven't done yet \u2014 we'll run Async coroutines in parallel using Parallel*. The idea of integrating the aforementioned extensions has already <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">been discussed<\/a><\/noindex> by the authors, but a consensus was never reached, so we will have to do it ourselves. <\/p>\n<p><i>* Running Swoole coroutines with Parallel didn't work; it seems these extensions are incompatible.<\/i><\/p>\n<p>So, the final results are:<\/p>\n<p><img decoding=\"async\" alt=\"Pospe\u0161ujemo PHP konektorje za Tarantool z Async, Swoole in Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Namesto zaklju\u010dka<\/h2>\n<p>\nIn my opinion, the results are quite impressive, and for some reason, I believe this is still not the limit! Whether you need this in a real project is entirely up to you; I will only say that for me it was an interesting experiment that allowed me to assess how much you can \"squeeze\" from a synchronous TCP connector with minimal effort. If you have ideas for improving the benchmarks \u2014 I would be happy to consider your pull request. All the code with instructions for running and results is published separately <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozitoriji<\/a><\/noindex>.<br \/>\n<br \/>Izvor: <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.4 - 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\/sl\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\udd47Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel | ProHoster","description":"In the PHP ecosystem.","canonical_url":"https:\/\/prohoster.info\/sl\/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":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}