{"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\/en\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn the PHP ecosystem, there are currently two connectors for working with the Tarantool server\u2014this is the official PECL extension <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, written in C, and <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, written in PHP. I am the author of the latter.<\/p>\n<p>In this article, I would like to share the results of performance testing of both libraries and show how with minimal code changes, you can achieve a 3-5 performance gain (<i>on synthetic tests!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>What will we test?<\/h2>\n<p>\nWe will test the aforementioned <i>synchronous<\/i> connectors running asynchronously, in parallel, and asynchronously in parallel. \ud83d\ude42 We also don't want to touch the connectors\u2019 code themselves. Currently, there are several extensions available that allow achieving the desired results:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> is a high-performance asynchronous framework for PHP. It is used by internet giants such as Alibaba and Baidu. Since version 4.1.0, a magical method has appeared, <i>SwooleRuntime::enableCoroutine()<\/i>, which allows 'with one line of code to convert synchronous network libraries in PHP into asynchronous ones.'\n<\/li>\n<li>Async was until recently a very promising extension for asynchronous work in PHP. Why 'was until recently'? Unfortunately, for an unknown reason, the author deleted the repository, and the future of the project is uncertain. We will have to use <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">one<\/a><\/noindex> from forks. Like Swoole, this extension allows you to easily switch to asynchronous mode by replacing the standard implementation of TCP and TLS streams with their asynchronous versions. This is done through the option \"<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> is a relatively new extension from the well-known Joe Watkins, the author of libraries such as phpdbg, apcu, pthreads, pcov, and uopz. The extension provides an API for multithreaded work in PHP and is positioned as a replacement for pthreads. A significant limitation of the library is that it only works with the ZTS (Zend Thread Safe) version of PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>How will we test?<\/h2>\n<p>\nLet's launch a Tarantool instance with the write-ahead logging disabled (<i>wal_mode = none<\/i>) and an increased network buffer (<i>readahead = 1 * 1024 * 1024<\/i>). The first option will eliminate disk operations, while the second will allow reading more requests from the operating system\u2019s buffer, thereby minimizing the number of system calls.<\/p>\n<p>For benchmarks that work with data (inserts, deletions, reads, etc.), a memtx space will be (re)created before the benchmark starts, in which the values of the primary index are generated by an ordered integer value generator (sequence).<br \/>\nThe DDL of the space looks like this:<\/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>\nIf necessary, before running the benchmark, the space is populated with 10,000 tuples of the form<\/p>\n<pre><code class=\"lua\">{id, \"tuple_\"}<\/code><\/pre>\n<p>\nAccess to the tuples is done using a random key value.<\/p>\n<p>The benchmark itself is a single request to the server that is executed 10,000 times (iterations), which are in turn executed in iterations. Iterations are repeated until all time deviations between 5 iterations are within an allowable margin of error of 3%*. After that, the average result is taken. There is a pause of 1 second between iterations to prevent the CPU from throttling. The Lua garbage collector is disabled before each iteration and forcibly started after its completion. The PHP process is launched only with the necessary extensions for the benchmark, with output buffering enabled and garbage collection disabled.<\/p>\n<p><i>* The number of iterations, cycles, and error threshold can be changed in the benchmark settings.<\/i><\/p>\n<h2>Test Environment<\/h2>\n<p>\nThe results published below were obtained on a MacBook Pro (2015), running Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool was run in Docker with the parameter \"<code>--network host\"<\/code>.<\/p>\n<p>Package versions:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (built: Oct 22 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch for 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>Unfortunately, the official connector does not work with PHP versions &gt; 7.2. To compile and run the extension on PHP 7.3, it was necessary to use <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">a patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Results<\/h2>\n<p><\/p>\n<h4>Synchronous Mode<\/h4>\n<p>\nTarantool's protocol uses a binary format <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> for message serialization. In the PECL connector, serialization is deeply hidden within the library, and affecting the encoding process from userland code <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">is not feasible.<\/a><\/noindex>The pure PHP connector, on the other hand, provides the ability to customize the encoding process by extending the standard encoder or by using your own implementation. Out of the box, there are two encoders available, one based on <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (the official MessagePack PECL extension), and the other based on <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (in pure PHP).<\/p>\n<p>Before comparing the connectors, let's measure the performance of the MessagePack encoders for the PHP connector, and in further tests, we will use the one that shows the best result:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlthough the PHP version (Pure) is slower than the PECL extension, in real projects, I would still recommend using <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, because the official MessagePack extension implements only part of the format specification (for example, there is no support for custom data types, without which you won't be able to use Decimal \u2014 a new data type introduced in Tarantool 2.3) and has several other <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">issues<\/a><\/noindex> (including compatibility issues with PHP 7.4). Overall, the project appears to be abandoned.<\/p>\n<p>So, let's measure the performance of the connectors in synchronous mode:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs seen from the graph, the PECL connector (Tarantool) shows better performance compared to the PHP connector (Client). This is not surprising, considering that the latter, aside from being implemented in a slower language, essentially does more work: a new object is created with every call <i>Request<\/i> and <i>Response<\/i> (in the case of Select \u2014 also <i>Criteria<\/i>, and in the case of Update\/Upsert \u2014 <i>Operations<\/i>), and separate entities <i>Connection<\/i>, <i>Packer <\/i>and <i>Handler<\/i> also add overhead. It is clear that flexibility comes at a cost. However, in general, the PHP interpreter shows good performance, even though there is a difference, it is insignificant and may become even smaller with the use of preloading in PHP 7.4, not to mention JIT in PHP 8.<\/p>\n<p>Moving on. Tarantool 2.0 introduced support for SQL. Let's try to perform Select, Insert, Update, and Delete operations using the SQL protocol and compare the results with the noSQL (binary) equivalents:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe SQL results are not particularly impressive (remember, we are still testing synchronous mode). However, I wouldn't be too quick to be disappointed about this; SQL support is still under active development (recently, for example, support for <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) was added, and judging by the list <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, the SQL engine will 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 results above. For writing asynchronous programs, the extension provides an API based on coroutines, which we will utilize. Through trial and error, we determine that the optimal number of coroutines for our environment is 25:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWe will 'spread' 10,000 operations across 25 coroutines and see what we achieve:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nThe number of operations per second increased more than threefold 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>What about SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and 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 has become negligible.<\/p>\n<h4>Swoole<\/h4>\n<p>\nOnce again, we determine the optimal number of coroutines, this time for Swoole:<br \/>\n<img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWe will settle on 25. We will repeat the same trick as with the Async extension\u2014distributing 10,000 operations among 25 coroutines. Additionally, we will add another test, where we split all work into 2 processes (that is, each process will execute 5,000 operations in 25 coroutines). Processes will be created using <i>SwooleProcess<\/i>. <\/p>\n<p>Results:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole 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 was 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 there I did not notice any difference when running benchmarks in one or several processes (it\u2019s possible that I made a mistake somewhere).<\/i><\/p>\n<p>SQL vs binary protocol:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and 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 leveled in asynchronous mode.<\/p>\n<h4>Parallel<\/h4>\n<p>\nSince the Parallel extension is not about coroutines, but about threads, let\u2019s measure the optimal number of parallel threads:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIt equals 16 on my machine. Let's run connector benchmarks on 16 parallel threads:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and 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 operation slots. This is related to the fact that these operations failed with an error\u2014I don't 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=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDid you notice the similarity with the graph for connectors run synchronously?<\/p>\n<h4>All together.<\/h4>\n<p>\nFinally, let's consolidate all the results into one 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\u2014running 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 has not yet been reached, so we\u2019ll have to do it ourselves. <\/p>\n<p><i>* It was not possible to run Swoole coroutines with Parallel, apparently these extensions are incompatible.<\/i><\/p>\n<p>So, the final results are:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerating PHP connectors for Tarantool using Async, Swoole, and Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>In conclusion<\/h2>\n<p>\nI believe the results are quite impressive, and for some reason, I'm confident that this is not the limit! Whether you need this in a real project is entirely up to you; I'll only say that for me, it was an interesting experiment that allowed assessing how much can be 'squeezed' out of a synchronous TCP connector with minimal effort. If you have ideas to improve the benchmarks\u2014I would gladly 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\">the repository<\/a><\/noindex>.<br \/>\n<br \/>Source: <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\/en\/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=\"en_US\" \/>\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\/en\/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\/en\/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":"en_US","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\/en\/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\/en\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}