{"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\/fr\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans l'\u00e9cosyst\u00e8me PHP, il existe actuellement deux connecteurs pour travailler avec le serveur Tarantool \u2015 c'est l'extension officielle PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, \u00e9crite en C, et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, \u00e9crite en PHP. Je suis l'auteur de ce dernier.<\/p>\n<p>Dans cet article, je voudrais partager les r\u00e9sultats des tests de performance des deux biblioth\u00e8ques et montrer comment, avec des modifications minimes du code, on peut atteindre une augmentation de 3 \u00e0 5 % de performance (<i>sur des tests synth\u00e9tiques !<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Qu'allons-nous tester ?<\/h2>\n<p>\nNous testerons les connecteurs mentionn\u00e9s ci-dessus <i>synchrones<\/i> , lanc\u00e9s de mani\u00e8re asynchrone, parall\u00e8lement et de mani\u00e8re asynchrone-parall\u00e8le. \ud83d\ude42 De plus, nous ne voulons pas toucher le code des connecteurs eux-m\u00eames. Actuellement, plusieurs extensions sont disponibles pour atteindre l'objectif souhait\u00e9 :<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 un framework asynchrone haute performance pour PHP. Utilis\u00e9 par des g\u00e9ants d'internet comme Alibaba et Baidu. Depuis la version 4.1.0, la m\u00e9thode magique <i>SwooleRuntime::enableCoroutine()<\/i>, permet \u00ab en une ligne de code de transformer les biblioth\u00e8ques r\u00e9seau synchrones PHP en asynchrones \u00bb.\n<\/li>\n<li>Async \u2015 jusqu'\u00e0 r\u00e9cemment, une extension tr\u00e8s prometteuse pour le travail asynchrone en PHP. Pourquoi jusqu'\u00e0 r\u00e9cemment ? Malheureusement, pour une raison qui m'est inconnue, l'auteur a supprim\u00e9 le d\u00e9p\u00f4t et l'avenir du projet est incertain. Il nous faudra utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">un<\/a><\/noindex> des forks. Tout comme Swoole, cette extension permet de transformer facilement les connexions TCP et TLS en les rempla\u00e7ant par leurs versions asynchrones. Cela se fait via l'option \u00ab<i>async.tcp = 1<\/i>\u00bb.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 une extension assez r\u00e9cente de Joe Watkins, l'auteur de biblioth\u00e8ques comme phpdbg, apcu, pthreads, pcov, uopz. L'extension fournit une API pour le travail multithread\u00e9 en PHP et se positionne comme un remplacement pour pthreads. Une limitation importante de la biblioth\u00e8que est qu'elle ne fonctionne qu'avec la version ZTS (Zend Thread Safe) de PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Comment allons-nous tester ?<\/h2>\n<p>\nLan\u00e7ons une instance de Tarantool avec le journal d'\u00e9criture anticip\u00e9e d\u00e9sactiv\u00e9 (\u00ab<i>wal_mode = none<\/i>) et avec un tampon r\u00e9seau agrandi (<i>readahead = 1 * 1024 * 1024<\/i>). La premi\u00e8re option exclura les op\u00e9rations d'\u00e9criture sur disque, la seconde permettra de lire plus de requ\u00eates \u00e0 partir du tampon du syst\u00e8me d'exploitation, minimisant ainsi le nombre d'appels syst\u00e8me.<\/p>\n<p>Pour les benchmarks qui fonctionnent avec des donn\u00e9es (insertion, suppression, lecture, etc.), un espace memtx sera (re)cr\u00e9\u00e9 avant le d\u00e9but du benchmark, o\u00f9 les valeurs de l'index primaire sont g\u00e9n\u00e9r\u00e9es par un g\u00e9n\u00e9rateur de valeurs enti\u00e8res s\u00e9quentielles.<br \/>\nLa DDL de l'espace est la suivante :<\/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>\nSi n\u00e9cessaire, avant de lancer le benchmark, l'espace est rempli avec 10 000 tuples de la forme<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nL'acc\u00e8s aux tuples se fait par une valeur de cl\u00e9 al\u00e9atoire.<\/p>\n<p>Le benchmark lui-m\u00eame est une seule requ\u00eate au serveur qui est ex\u00e9cut\u00e9e 10 000 fois (r\u00e9volutions), qui, \u00e0 leur tour, sont effectu\u00e9es en it\u00e9rations. Les it\u00e9rations se r\u00e9p\u00e8tent tant que toutes les d\u00e9viations de temps entre 5 it\u00e9rations ne se situent pas dans une marge d'erreur acceptable de 3 %*. Apr\u00e8s cela, le r\u00e9sultat moyen est pris. Entre les it\u00e9rations, il y a une pause d'1 seconde, afin de ne pas permettre au processeur de passer en throttling. Le collecteur de d\u00e9chets Lua est d\u00e9sactiv\u00e9 avant chaque it\u00e9ration et est forc\u00e9 de s'ex\u00e9cuter apr\u00e8s sa terminaison. Le processus PHP est lanc\u00e9 uniquement avec les extensions n\u00e9cessaires pour le benchmark, avec la mise en tampon de sortie activ\u00e9e et le collecteur de d\u00e9chets d\u00e9sactiv\u00e9.<\/p>\n<p><i>* Le nombre de r\u00e9volutions, d'it\u00e9rations et le seuil d'erreur peuvent \u00eatre modifi\u00e9s dans les param\u00e8tres du benchmark.<\/i><\/p>\n<h2>Environnement de test<\/h2>\n<p>\nLes r\u00e9sultats publi\u00e9s ci-dessous ont \u00e9t\u00e9 obtenus sur un MacBook Pro (2015), syst\u00e8me d'exploitation \u2014 Fedora 30 (version du noyau 5.3.8-200.fc30.x86_64). Tarantool a \u00e9t\u00e9 lanc\u00e9 dans Docker avec l'option \u00ab<code>--network host\"<\/code>.<\/p>\n<p>Versions des paquets :<\/p>\n<p>Tarantool : 2.3.0-115-g5ba5ed37e<br \/>\nDocker : 19.03.3, build a872fc2f86<br \/>\nPHP : 7.3.11 (cli) (construit : 22 oct. 2019 08:11:04)<br \/>\ntarantool\/client : 0.6.0<br \/>\nrybakit\/msgpack : 0.6.1<br \/>\next-tarantool : 0.3.2 (+ patch pour 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>Malheureusement, le connecteur officiel ne fonctionne pas avec la version PHP &gt; 7.2. Pour compiler et ex\u00e9cuter l'extension sur PHP 7.3, il a fallu utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch<\/a><\/noindex>.<\/i><\/p>\n<h2>R\u00e9sultats<\/h2>\n<p><\/p>\n<h4>Mode synchrone<\/h4>\n<p>\nLe protocole de Tarantool utilise un format binaire <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> pour la s\u00e9rialisation des messages. Dans le connecteur PECL, la s\u00e9rialisation est profond\u00e9ment cach\u00e9e au sein de la biblioth\u00e8que et il n'est pas possible d'influencer le processus d'encodage depuis le code userland <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">.<\/a><\/noindex>. Le connecteur en PHP pur, quant \u00e0 lui, offre la possibilit\u00e9 de personnaliser le processus de codage en \u00e9tendant le codeur standard ou en utilisant sa propre impl\u00e9mentation. Deux codeurs sont disponibles par d\u00e9faut, l'un bas\u00e9 sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (l'extension officielle MessagePack PECL), l'autre \u00e9tant bas\u00e9 sur <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (en PHP pur).<\/p>\n<p>Avant de comparer les connecteurs, mesurons les performances des codeurs MessagePack pour le connecteur PHP, et lors des tests suivants, nous utiliserons celui qui montrera le meilleur r\u00e9sultat :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBien que la version PHP (Pure) soit moins rapide que l'extension PECL, dans des projets r\u00e9els, je recommanderais tout de m\u00eame d'utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, car dans l'extension officielle MessagePack, la sp\u00e9cification du format n'est mise en \u0153uvre que partiellement (par exemple, il n'y a pas de support pour les types de donn\u00e9es personnalis\u00e9s, sans lesquels vous ne pourrez pas utiliser Decimal - un nouveau type de donn\u00e9es introduit dans Tarantool 2.3) et pr\u00e9sente plusieurs autres <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">des probl\u00e8mes<\/a><\/noindex> (y compris des probl\u00e8mes de compatibilit\u00e9 avec PHP 7.4). Dans l'ensemble, le projet semble abandonn\u00e9.<\/p>\n<p>Mesurons donc les performances des connecteurs en mode synchrone :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComme le montre le graphique, le connecteur PECL (Tarantool) affiche de meilleures performances par rapport au connecteur en PHP (Client). Ce n'est pas surprenant, compte tenu du fait que ce dernier, en plus d'\u00eatre impl\u00e9ment\u00e9 dans un langage plus lent, effectue en r\u00e9alit\u00e9 plus de travail : \u00e0 chaque appel, un nouvel objet est cr\u00e9\u00e9 <i>Request<\/i> et <i>Response<\/i> (dans le cas de Select \u2014 aussi <i>Criteria<\/i>, et dans le cas de Update\/Upsert \u2014 <i>Operations<\/i>), des entit\u00e9s distinctes <i>Connexion<\/i>, <i>Packer <\/i>et <i>Handler<\/i> ajoutent \u00e9galement un surco\u00fbt. Il est \u00e9vident que la flexibilit\u00e9 a un prix. Cependant, dans l'ensemble, l'interpr\u00e9teur PHP montre de bonnes performances, m\u00eame si la diff\u00e9rence existe, elle est minime et sera probablement encore plus faible avec l'utilisation de preloading dans PHP 7.4, sans parler de JIT dans PHP 8.<\/p>\n<p>Continuons. Dans Tarantool 2.0, le support de SQL a \u00e9t\u00e9 ajout\u00e9. Essayons d'effectuer des op\u00e9rations Select, Insert, Update et Delete en utilisant le protocole SQL et comparons les r\u00e9sultats avec leurs \u00e9quivalents noSQL (binaires) :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLes r\u00e9sultats SQL ne sont pas tr\u00e8s impressionnants (je rappelle que nous testons toujours le mode synchrone). Cependant, je ne voudrais pas me d\u00e9courager \u00e0 ce sujet trop t\u00f4t, car le support de SQL est encore en d\u00e9veloppement actif (r\u00e9cemment, par exemple, le support de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) a \u00e9t\u00e9 ajout\u00e9, et d'apr\u00e8s la liste <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, le moteur SQL attendra d'autres optimisations.<\/p>\n<h4>Async<\/h4>\n<p>\nVoyons maintenant comment l'extension Async peut nous aider \u00e0 am\u00e9liorer les r\u00e9sultats ci-dessus. Pour \u00e9crire des programmes asynchrones, l'extension fournit une API bas\u00e9e sur des coroutines, que nous allons utiliser. Par exp\u00e9rimentation, nous d\u00e9couvrons que le nombre optimal de coroutines pour notre environnement est de 25 :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNous '\u00e9talons' 10 000 op\u00e9rations sur 25 coroutines et voyons ce que cela donne :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe nombre d'op\u00e9rations par seconde a plus que tripl\u00e9 pour <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Malheureusement, le connecteur PECL ne s'est pas lanc\u00e9 avec ext-async.<\/p>\n<p>Qu'en est-il de SQL ?<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComme vous le voyez, en mode asynchrone, la diff\u00e9rence entre le protocole binaire et SQL est dans les limites de l'erreur.<\/p>\n<h4>Swoole<\/h4>\n<p>\nNous d\u00e9couvrons \u00e0 nouveau le nombre optimal de coroutines, cette fois pour Swoole :<br \/>\n<img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNous nous limiterons \u00e0 25. R\u00e9p\u00e9tons la m\u00eame astuce qu'avec l'extension Async : r\u00e9partissons 10 000 op\u00e9rations entre 25 coroutines. De plus, nous ajouterons un autre test, dans lequel nous diviserons tout le travail en 2 processus (c'est-\u00e0-dire que chaque processus effectuera 5 000 op\u00e9rations dans 25 coroutines). Les processus seront cr\u00e9\u00e9s \u00e0 l'aide de <i>SwooleProcess<\/i>. <\/p>\n<p>R\u00e9sultats :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole montre l\u00e9g\u00e8rement de moins bons r\u00e9sultats par rapport \u00e0 Async lors de l'ex\u00e9cution dans un seul processus, mais avec 2 processus, la situation change radicalement (le nombre 2 n'est pas choisi au hasard, sur ma machine, 2 processus ont montr\u00e9 les meilleurs r\u00e9sultats).<\/p>\n<p><i>D'ailleurs, l'extension Async a aussi une API pour travailler avec des processus, mais je n'ai pas remarqu\u00e9 de diff\u00e9rences significatives lors de l'ex\u00e9cution des benchmarks dans un ou plusieurs processus (il est possible que j'aie fait une erreur quelque part).<\/i><\/p>\n<p>SQL vs protocole binaire :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTout comme avec Async, la diff\u00e9rence entre les op\u00e9rations binaires et SQL est att\u00e9nu\u00e9e en mode asynchrone.<\/p>\n<h4>Parallel<\/h4>\n<p>\nPuisque l'extension Parallel ne concerne pas les coroutines, mais les threads, mesurons le nombre optimal de threads parall\u00e8les :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl est de 16 sur ma machine. Lan\u00e7ons des benchmarks de connecteurs sur 16 threads parall\u00e8les :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nComme vous le voyez, le r\u00e9sultat est m\u00eame meilleur qu'avec les extensions asynchrones (\u00e0 l'exception de Swoole ex\u00e9cut\u00e9 sur 2 processus). Notez que pour le connecteur PECL, il n'y a rien sur les op\u00e9rations Update et Upsert. Cela est d\u00fb au fait que ces op\u00e9rations ont \u00e9chou\u00e9 avec une erreur - je ne sais pas si c'est \u00e0 cause de ext-parallel, ext-tarantool ou des deux.<\/p>\n<p>Comparons maintenant les performances de SQL :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAvez-vous remarqu\u00e9 la similitude avec le graphique des connecteurs ex\u00e9cut\u00e9s de mani\u00e8re synchrone ?<\/p>\n<h4>Tout ensemble<\/h4>\n<p>\nEnfin, rassemblons tous les r\u00e9sultats dans un seul graphique pour voir la vue d'ensemble des extensions test\u00e9es. Nous allons ajouter un nouveau test que nous n'avons pas encore effectu\u00e9 : ex\u00e9cuter des coroutines Async en parall\u00e8le avec Parallel*. L'id\u00e9e d'int\u00e9grer les extensions mentionn\u00e9es ci-dessus a d\u00e9j\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">\u00e9t\u00e9 discut\u00e9e<\/a><\/noindex> par les auteurs, mais aucun consensus n'a \u00e9t\u00e9 atteint, il va donc falloir le faire soi-m\u00eame. <\/p>\n<p><i>* Lancer des coroutines Swoole avec Parallel n'a pas fonctionn\u00e9, il semble que ces extensions soient incompatibles.<\/i><\/p>\n<p>Voici donc les r\u00e9sultats finaux :<\/p>\n<p><img decoding=\"async\" alt=\"Acc\u00e9l\u00e9rer les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>En conclusion<\/h2>\n<p>\n\u00c0 mon avis, les r\u00e9sultats sont assez remarquables, et j'ai l'impression que ce n'est pas encore la limite ! Il vous revient de d\u00e9cider si cela vous est n\u00e9cessaire dans un projet r\u00e9el, je dirai seulement que pour moi, cela a \u00e9t\u00e9 une exp\u00e9rience int\u00e9ressante, permettant d'\u00e9valuer combien on peut \u00ab tirer \u00bb d'un connecteur TCP synchronis\u00e9 avec un minimum d'efforts. Si vous avez des id\u00e9es pour am\u00e9liorer les benchmarks, je consid\u00e9rerai avec plaisir votre pull request. L'ensemble du code avec les instructions de lancement et les r\u00e9sultats a \u00e9t\u00e9 publi\u00e9 dans un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">d\u00e9p\u00f4ts<\/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\/fr\/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=\"fr_FR\" \/>\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\/fr\/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\udd47Acc\u00e9l\u00e9rons les connecteurs PHP pour Tarantool avec Async, Swoole et Parallel | ProHoster","description":"l'\u00e9cosyst\u00e8me PHP.","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}