{"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\/ro\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen ecosistemul PHP, \u00een prezent exist\u0103 doi conectori pentru a lucra cu serverul Tarantool - este vorba despre extensia oficial\u0103 PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, scris\u0103 \u00een C, \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, scris\u0103 \u00een PHP. Eu sunt autorul ultimei.<\/p>\n<p>\u00cen acest articol, a\u0219 dori s\u0103 \u00eemp\u0103rt\u0103\u0219esc rezultatele test\u0103rii performan\u021bei ambelor biblioteci \u0219i s\u0103 ar\u0103t cum, cu modific\u0103ri minime \u00een cod, se poate ob\u021bine o cre\u0219tere a performan\u021bei de 3-5% (<i>pe teste sintetice!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Ce vom testa?<\/h2>\n<p>\nVom testa conectorii men\u021biona\u021bi anterior <i>sincron<\/i> care vor fi rula\u021bi asincron, \u00een paralel \u0219i asincron-paralel. \ud83d\ude42 De asemenea, nu dorim s\u0103 modific\u0103m codul conectorilor \u00een sine. \u00cen prezent, exist\u0103 c\u00e2teva extensii disponibile care permit realizarea dorit\u0103:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 un cadru asincron de \u00eenalt\u0103 performan\u021b\u0103 pentru PHP. Este folosit de gigan\u021bi ai internetului precum Alibaba \u0219i Baidu. \u00cencep\u00e2nd cu versiunea 4.1.0, a ap\u0103rut o metod\u0103 magic\u0103 <i>SwooleRuntime::enableCoroutine()<\/i>, care permite \"cu o singur\u0103 linie de cod s\u0103 transforme bibliotecile de re\u021bea sincrone PHP \u00een cele asincrone\".\n<\/li>\n<li>Async \u2015 p\u00e2n\u0103 de cur\u00e2nd o extensie promi\u021b\u0103toare pentru lucrul asincron \u00een PHP. De ce p\u00e2n\u0103 de cur\u00e2nd? Din p\u0103cate, din motive necunoscute, autorul a \u0219ters repository-ul, iar soarta ulterioar\u0103 a proiectului este incert\u0103. Va trebui s\u0103 folosim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">una<\/a><\/noindex> din fork-uri. Ca \u0219i Swoole, aceast\u0103 extensie permite s\u0103 transforma\u021bi cu u\u0219urin\u021b\u0103 observa\u021bia \u00een activitate asynchron\u0103, \u00eenlocuind implementarea standard a fluxurilor TCP \u0219i TLS cu versiunile lor asincrone. Acest lucru se face prin op\u021biunea &#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 o extensie destul de nou\u0103 de la binecunoscutul Joe Watkins, autor al unor biblioteci precum phpdbg, apcu, pthreads, pcov, uopz. Extensia ofer\u0103 API pentru programarea multiplus \u0219i este pozi\u021bionat\u0103 ca o alternativ\u0103 la pthreads. O limitare semnificativ\u0103 a bibliotecii este c\u0103 func\u021bioneaz\u0103 doar cu versiuni PHP ZTS (Zend Thread Safe).\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Cum vom testa?<\/h2>\n<p>\nS\u0103 pornim o instan\u021b\u0103 de Tarantool cu jurnalul de \u00eenregistrare anticipat\u0103 dezactivat (<i>wal_mode = none<\/i>) \u0219i cu un buffer de re\u021bea m\u0103rit (<i>readahead = 1 * 1024 * 1024<\/i>). Prima op\u021biune va exclude lucrul cu discul, iar a doua va permite citirea mai multor cereri din bufferul sistemului de operare, minimiz\u00e2nd astfel num\u0103rul apelurilor de sistem.<\/p>\n<p>Pentru benchmark-urile care lucreaz\u0103 cu date (inserare, \u0219tergere, citire etc.), \u00eenainte de a \u00eencepe benchmark-ul, va fi (re)creat un spa\u021biu memtx, \u00een care valorile indexului primar sunt generate de un generator de valori ordonate ale numerelor \u00eentregi (sequence).<br \/>\nDDL-ul spa\u021biului arat\u0103 astfel:<\/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>\nDac\u0103 este necesar, \u00eenainte de a \u00eencepe benchmark-ul, spa\u021biul se umple cu 10,000 de tuple de tipul<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nAccesul la tupluri se face printr-o valoare aleatorie a cheii.<\/p>\n<p>Benchmark-ul \u00een sine este o singur\u0103 cerere c\u0103tre server, care se execut\u0103 de 10,000 de ori (revolu\u021bii), care, la r\u00e2ndul s\u0103u, sunt executate \u00een itera\u021bii. Itera\u021biile se repet\u0103 p\u00e2n\u0103 c\u00e2nd toate varia\u021biile de timp \u00eentre 5 itera\u021bii sunt \u00een limitele de toleran\u021b\u0103 acceptabile de 3 %*. Dup\u0103 aceea, se ia un rezultat mediat. \u00centre itera\u021bii se face o pauz\u0103 de 1 secund\u0103, pentru a nu permite procesorului s\u0103 intre \u00een throttling. Colectorul de gunoi Lua este oprit \u00eenainte de fiecare itera\u021bie \u0219i pornit for\u021bat dup\u0103 finalizarea acesteia. Procesul PHP este lansat doar cu extensiile necesare pentru benchmark, cu bufferizarea ie\u0219irii activat\u0103 \u0219i colectorul de gunoi dezactivat.<\/p>\n<p><i>* Num\u0103rul de revolu\u021bii, itera\u021bii \u0219i pragul de toleran\u021b\u0103 pot fi modificate \u00een set\u0103rile benchmark-ului.<\/i><\/p>\n<h2>Mediul de testare<\/h2>\n<p>\nRezultatele publicate mai jos au fost ob\u021binute pe un MacBook Pro (2015), sistemul de operare \u2014 Fedora 30 (versiunea kernel 5.3.8-200.fc30.x86_64). Tarantool a fost rulat \u00een Docker cu parametrul &#171;<code>--network host\"<\/code>.<\/p>\n<p>Versiunile pachetelor:<\/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 pentru 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>Din p\u0103cate, conectorul oficial nu func\u021bioneaz\u0103 cu versiunea PHP &gt; 7.2. Pentru a compila \u0219i a rula extensia pe PHP 7.3, a fost necesar s\u0103 se utilizeze <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch-ul<\/a><\/noindex>.<\/i><\/p>\n<h2>Rezultate<\/h2>\n<p><\/p>\n<h4>Modul sincron<\/h4>\n<p>\nProtocolul Tarantool utilizeaz\u0103 un format binar <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> pentru serializarea mesajelor. \u00cen conectorul PECL, serializarea este ascuns\u0103 profund \u00een ad\u00e2ncurile bibliotecii \u0219i influen\u021barea procesului de codificare din codul userland <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">nu este posibil\u0103.<\/a><\/noindex>. Connectorul pe PHP pur, pe de alt\u0103 parte, ofer\u0103 posibilitatea personaliz\u0103rii procesului de codare prin extinderea codificatorului standard sau prin utilizarea propriei implement\u0103ri. Din cutie sunt disponibile dou\u0103 codificatoare, unul bazat pe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (extensia oficial\u0103 MessagePack PECL), cel\u0103lalt - pe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (pe PHP pur).<\/p>\n<p>\u00cenainte de a compara conectorii, s\u0103 m\u0103sur\u0103m performan\u021ba codificatorilor MessagePack pentru conectorul PHP \u0219i \u00een testele ulterioare vom folosi acela care va ar\u0103ta cel mai bun rezultat:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDe\u0219i versiunea PHP (Pure) este inferioar\u0103 extensiei PECL \u00een vitez\u0103, \u00een proiectele reale, totu\u0219i, a\u0219 recomanda utilizarea acestuia <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, deoarece \u00een extensia oficial\u0103 MessagePack specifica\u021bia formatului este implementat\u0103 doar par\u021bial (de exemplu, nu exist\u0103 suport pentru tipuri de date personalizate, f\u0103r\u0103 de care nu ve\u021bi putea utiliza Decimal - noul tip de date introdus \u00een Tarantool 2.3) \u0219i prezint\u0103 o serie de alte <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemelor<\/a><\/noindex> (inclusiv probleme de compatibilitate cu PHP 7.4). \u00cen general, proiectul pare abandonat.<\/p>\n<p>A\u0219adar, s\u0103 m\u0103sur\u0103m performan\u021ba conectorilor \u00een modul sincron:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDup\u0103 cum se vede din grafic, conectorul PECL (Tarantool) arat\u0103 o performan\u021b\u0103 mai bun\u0103 \u00een compara\u021bie cu conectorul pe PHP (Client). Dar nu este de mirare, av\u00e2nd \u00een vedere c\u0103 acesta din urm\u0103, pe l\u00e2ng\u0103 faptul c\u0103 este implementat \u00eentr-o limb\u0103 mai lent\u0103, efectueaz\u0103, \u00een esen\u021b\u0103, mai mult\u0103 munc\u0103: la fiecare apel se creeaz\u0103 un nou obiect <i>Request<\/i> \u0219i <i>Response<\/i> (\u00een cazul Select - \u0219i <i>Criteria<\/i>, iar \u00een cazul Update\/Upsert - <i>Operations<\/i>), entit\u0103\u021bile separate <i>Connection<\/i>, <i>Packer <\/i>\u0219i <i>Handler<\/i> de asemenea, adaug\u0103 overhead. Evident, flexibilitatea are un pre\u021b. Cu toate acestea, \u00een general, interpretatorul PHP arat\u0103 o bun\u0103 performan\u021b\u0103, de\u0219i diferen\u021ba exist\u0103, aceasta este nesemnificativ\u0103 \u0219i, probabil, va fi \u0219i mai mic\u0103 cu utilizarea preloading \u00een PHP 7.4, nemaivorbind de JIT \u00een PHP 8.<\/p>\n<p>S\u0103 continu\u0103m. \u00cen Tarantool 2.0 a ap\u0103rut suportul pentru SQL. S\u0103 \u00eencerc\u0103m s\u0103 execut\u0103m opera\u021biile Select, Insert, Update \u0219i Delete folosind protocolul SQL \u0219i s\u0103 compar\u0103m rezultatele cu echivalentele noSQL (binare):<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRezultatele SQL nu sunt foarte impresionante (re\u021bin c\u0103 \u00eenc\u0103 test\u0103m modul sincron). Totu\u0219i, nu a\u0219 vrea s\u0103 m\u0103 descurajez din cauza acestui lucru prea devreme, suportul pentru SQL este \u00eenc\u0103 \u00een dezvoltare activ\u0103 (recent, de exemplu, a fost ad\u0103ugat suport pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) \u0219i, judec\u00e2nd dup\u0103 lista <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, motorul SQL a\u0219teapt\u0103 o serie de optimiz\u0103ri.<\/p>\n<h4>Async<\/h4>\n<p>\nEi bine, s\u0103 vedem acum cum ne poate ajuta extensia Async s\u0103 \u00eembun\u0103t\u0103\u021bim rezultatele de mai sus. Pentru scrierea programelor asincrone, extensia ofer\u0103 un API bazat pe corutine (coroutines), pe care \u00eel vom utiliza. Prin experiment, am constatat c\u0103 num\u0103rul optim de corutine pentru mediu nostru este 25:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u201eDistribuim\u201d 10.000 de opera\u021bii pe 25 de corutine \u0219i vedem ce a ie\u0219it:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNum\u0103rul de opera\u021bii pe secund\u0103 a crescut de mai bine de 3 ori pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Din p\u0103cate, conectorul PECL nu s-a lansat cu ext-async.<\/p>\n<p>Dar ce este cu SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDup\u0103 cum pute\u021bi vedea, \u00een modul asincron, diferen\u021ba dintre protocolul binar \u0219i SQL a intrat \u00een marja de eroare.<\/p>\n<h4>Swoole<\/h4>\n<p>\nDin nou, stabilim num\u0103rul optim de corutine, acum pentru Swoole:<br \/>\n<img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNe vom opri la 25. Vom repeta aceea\u0219i manevr\u0103 ca \u0219i cu extensia Async - vom distribui 10.000 de opera\u021bii \u00eentre 25 de corutine. \u00cen plus, vom ad\u0103uga un alt test, \u00een care vom \u00eemp\u0103r\u021bi toat\u0103 munca \u00een 2 procese (adic\u0103 fiecare proces va executa 5.000 de opera\u021bii \u00een 25 de corutine). Procesele vor fi create prin intermediul <i>SwooleProcess<\/i>. <\/p>\n<p>Rezultatele:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole arat\u0103 un rezultat u\u0219or mai sc\u0103zut comparativ cu Async atunci c\u00e2nd este lansat \u00eentr-un singur proces, dar cu 2 procese, imaginea se schimb\u0103 radical (num\u0103rul 2 nu este ales \u00eent\u00e2mpl\u0103tor, pe ma\u0219ina mea, exact 2 procese au dat cele mai bune rezultate).<\/p>\n<p><i>Apropo, \u00een extensia Async exist\u0103 \u0219i un API pentru lucrul cu procese, totu\u0219i, nu am observat nicio diferen\u021b\u0103 \u00een ceea ce prive\u0219te rularea benchmark-urilor \u00eentr-un proces sau \u00een mai multe (nu exclud c\u0103 am gre\u0219it pe undeva).<\/i><\/p>\n<p>SQL vs protocolul binar:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA\u0219a cum s-a \u00eent\u00e2mplat \u0219i cu Async, diferen\u021ba dintre opera\u021biile binare \u0219i SQL se estompeaz\u0103 \u00een modul asincron.<\/p>\n<h4>Parallel<\/h4>\n<p>\nDeoarece extensia Parallel nu este despre corutine, ci despre fire, s\u0103 m\u0103sur\u0103m num\u0103rul optim de fire paralele:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEste de 16 pe ma\u0219ina mea. S\u0103 lans\u0103m benchmark-urile conectorilor pe 16 fire paralele:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDup\u0103 cum pute\u021bi observa, rezultatul este chiar mai bun dec\u00e2t cu extensiile asincrone (f\u0103r\u0103 a lua \u00een considerare Swoole rul\u00e2nd pe 2 procese). Re\u021bine\u021bi c\u0103 pentru conectorul PECL, la Update \u0219i Upsert opera\u021biile sunt goale. Aceasta se datoreaz\u0103 faptului c\u0103 aceste opera\u021bii au e\u0219uat cu o eroare - nu \u0219tiu din cauza ext-parallel, ext-tarantool sau a ambelor.<\/p>\n<p>Acum s\u0103 compar\u0103m performan\u021ba SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA\u021bi observat asem\u0103narea cu graficul pentru conectorii rula\u021bi sincron?<\/p>\n<h4>Totul \u00eempreun\u0103<\/h4>\n<p>\n\u0218i, \u00een cele din urm\u0103, s\u0103 reunim toate rezultatele \u00eentr-un singur grafic pentru a vedea imaginea de ansamblu a extensiilor testate. Vom ad\u0103uga pe grafic doar un nou test pe care nu l-am efectuat \u00eenc\u0103 \u2015 vom rula corutine Async \u00een paralel folosind Parallel*. Ideea integr\u0103rii extensiilor men\u021bionate mai sus a fost <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">discutat\u0103<\/a><\/noindex> de autori, dar nu s-a ajuns la un consens, va trebui s\u0103 facem asta singuri. <\/p>\n<p><i>* Nu am reu\u0219it s\u0103 rulez corutine Swoole cu Parallel, se pare c\u0103 aceste extensii sunt incompatibile.<\/i><\/p>\n<p>A\u0219adar, rezultatele finale sunt:<\/p>\n<p><img decoding=\"async\" alt=\"Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>\u00cen concluzie<\/h2>\n<p>\n\u00cen opinia mea, rezultatele ob\u021binute sunt destul de remarcabile \u0219i, din c\u00e2te am observat, sunt de p\u0103rere c\u0103 acesta nu este chiar limita! Dac\u0103 ave\u021bi nevoie de asta \u00eentr-un proiect real, este decizia exclusiv a dumneavoastr\u0103, pot spune doar c\u0103 pentru mine a fost un experiment interesant, care permite evaluarea a c\u00e2t de mult se poate \u201eextrage\u201d dintr-un conector TCP sincron cu un efort minim. Dac\u0103 ave\u021bi sugestii pentru \u00eembun\u0103t\u0103\u021birea benchmark-urilor, voi lua \u00een considerare cu pl\u0103cere cererea dumneavoastr\u0103 de pull. \u00centreg codul cu instruc\u021biuni de rulare \u0219i rezultate este publicat \u00eentr-un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repository<\/a><\/noindex>.<br \/>\n<br \/>Sursa: <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.1 - 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\/ro\/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.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Acceler\u0103m conectorii PHP pentru Tarantool folosind Async, Swoole \u0219i Parallel | ProHoster","description":"Ecosistem PHP.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}