{"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\/lv\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPHP ekosist\u0113m\u0101 \u0161obr\u012bd past\u0101v divi savienot\u0101ji, lai str\u0101d\u0101tu ar Tarantool serveri \u2013 ofici\u0101l\u0101 PECL papla\u0161in\u0101juma <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, kas rakst\u012bts C, un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, kas rakst\u012bts PHP. Esmu p\u0113d\u0113j\u0101 autors.<\/p>\n<p>\u0160aj\u0101 rakst\u0101 es v\u0113l\u0113tos dal\u012bties ar test\u0113\u0161anas rezult\u0101tiem, izmantojot abas bibliot\u0113kas, un par\u0101d\u012bt, k\u0101 ar minim\u0101l\u0101m izmai\u0146\u0101m kod\u0101 var sasniegt 3-5% veiktsp\u0113jas pieaugumu (<i>sint\u0113tiskajos testos!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Ko test\u0113sim?<\/h2>\n<p>\nTest\u0113sim iepriek\u0161 min\u0113tos <i>siner\u0123iskos<\/i> savienot\u0101jus, palaistus asinhroni, paral\u0113li un asinhroni-paral\u0113li. \ud83d\ude42 T\u0101pat m\u0113s nev\u0113lamies main\u012bt pa\u0161u savienot\u0101ju kodu. \u0160obr\u012bd ir pieejami vair\u0101ki papla\u0161in\u0101jumi, kas \u013cauj sasniegt v\u0113lamo:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 augstas veiktsp\u0113jas asinhronais ietvars PHP. To izmanto t\u0101di interneta mil\u017ei k\u0101 Alibaba un Baidu. S\u0101kot ar versiju 4.1.0, par\u0101d\u012bj\u0101s burvju metode <i>SwooleRuntime::enableCoroutine()<\/i>, kas \u013cauj \"ar vienu koda rindu p\u0101rveidot sinhron\u0101s t\u012bkla bibliot\u0113kas PHP par asinhron\u0101m\".\n<\/li>\n<li>Async \u2015 l\u012bdz nesenam laikam bija diezgan perspekt\u012bvs papla\u0161in\u0101jums asinhronai darb\u012bbai PHP. K\u0101p\u0113c l\u012bdz nesenam? Diem\u017e\u0113l, nezin\u0101mu iemeslu d\u0113\u013c autors izdz\u0113sa repozitoriju, un turpm\u0101k\u0101 projekta liktenis ir neskaidrs. Atliek izmantot <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">vienu<\/a><\/noindex> no forkiem. T\u0101pat k\u0101 Swoole, \u0161is papla\u0161in\u0101jums \u013cauj viegli p\u0101rv\u0113rst bikses, iek\u013caujot asynchronit\u0101ti, nomainot standarta TCP un TLS str\u0101vu to asinkronaj\u0101s versij\u0101s. To var izdar\u012bt, izmantojot opciju &#171;<i>async.tcp = 1<\/i>\u00ab.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 sal\u012bdzino\u0161i jauns papla\u0161in\u0101jums no visp\u0101rzin\u0101m\u0101 Joe Watkins, kura rad\u012btie ir t\u0101das bibliot\u0113kas k\u0101 phpdbg, apcu, pthreads, pcov, uopz. Papla\u0161in\u0101jums pied\u0101v\u0101 API daudzpavedienu darbam PHP un pozicion\u0113jas k\u0101 pthreads aizvietot\u0101js. Ierobe\u017eojo\u0161s faktors ir tas, ka bibliot\u0113ka darbojas tikai ar ZTS (Zend Thread Safe) PHP versiju.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>K\u0101 test\u0113sim?<\/h2>\n<p>\nPalaid\u012bsim Tarantool&#8217;u ar izsl\u0113gtu proakt\u012bvo \u017eurn\u0101lu (<i>wal_mode = none<\/i>) un palielin\u0101tu t\u012bkla buferi (<i>readahead = 1 * 1024 * 1024<\/i>). Pirmais variants izsl\u0113gs darbu ar disku, otrais \u2013 \u013caus izlas\u012bt vair\u0101k piepras\u012bjumus no oper\u0113t\u0101jsist\u0113mas bufera, t\u0101d\u0113j\u0101di minimiz\u0113jot sist\u0113miskos izsaukumus.<\/p>\n<p>Veicot p\u0101rbaudes, kas darbojas ar datiem (ievieto\u0161ana, dz\u0113\u0161ana, las\u012b\u0161ana utt.), pirms p\u0101rbaudes s\u0101k\u0161anas tiks (p\u0101)veidots memtx-kr\u0101jums, kur\u0101 prim\u0101r\u0101 indeksa v\u0113rt\u012bbas tiek \u0123ener\u0113tas ar sak\u0101rtotu vesel\u0101s skait\u013cu v\u0113rt\u012bbu \u0123eneratoru (sec\u012bba).<br \/>\nDDL kr\u0101jums izskat\u0101s \u0161\u0101di:<\/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>\nJa nepiecie\u0161ams, pirms p\u0101rbaudes uzs\u0101k\u0161anas kr\u0101jums tiek aizpild\u012bts ar 10,000 krot\u0113m form\u0101t\u0101<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nPiek\u013cuve krot\u0113m tiek veikta p\u0113c nejau\u0161a atsl\u0113gas v\u0113rt\u012bbas.<\/p>\n<p>Pati p\u0101rbaude ir vienots piepras\u012bjums uz serveri, kas tiek veikts 10,000 rei\u017eu (revol\u016bcijas), kuras, savuk\u0101rt, tiek izpild\u012btas iter\u0101cij\u0101s. Iter\u0101cijas tiek atk\u0101rtotas, l\u012bdz visu laiku novirzes starp 5 iter\u0101cij\u0101m atrodas pie\u013caujam\u0101 k\u013c\u016bdas robe\u017e\u0101 3 %*. P\u0113c tam tiek \u0146emts vid\u0113jais rezult\u0101ts. Starp iter\u0101cij\u0101m ir viena sekunde p\u0101rtraukums, lai nepie\u013cautu procesora p\u0101rlieku noslodzi. Lua atkritumu sav\u0101c\u0113js tiek izsl\u0113gts pirms katras iter\u0101cijas un piespiedu k\u0101rt\u0101 aktiviz\u0113ts p\u0113c t\u0101s pabeig\u0161anas. PHP process tiek uzs\u0101kts tikai ar nepiecie\u0161amajiem papla\u0161in\u0101jumiem p\u0101rbaudei, izsl\u0113dzot atkritumu sav\u0101c\u0113ju un iesl\u0113dzot izejas buferiz\u0101ciju.<\/p>\n<p><i>* Revol\u016bciju, iter\u0101ciju skaitu un k\u013c\u016bdas robe\u017eu var main\u012bt p\u0101rbaudes iestat\u012bjumos.<\/i><\/p>\n<h2>Test\u0113\u0161anas vide<\/h2>\n<p>\nZem\u0101k public\u0113tie rezult\u0101ti tika ieg\u016bti MacBookPro (2015) ar oper\u0113t\u0101jsist\u0113mu \u2014 Fedora 30 (kodola versija 5.3.8-200.fc30.x86_64). Tarantool tika palaists Docker vid\u0113 ar parametru &#171;<code>--network host\"<\/code>.<\/p>\n<p>Pakalpojumu versijas:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (b\u016bv\u0113ts: 22. oktobris 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ labojumam 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>Diem\u017e\u0113l ofici\u0101lais savienot\u0101js nesadarbojas ar PHP versiju &gt; 7.2. Lai b\u016btu iesp\u0113jams kompil\u0113t un uzs\u0101kt papla\u0161in\u0101jumu PHP 7.3, bija j\u0101izmanto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">pl\u0101ksteri<\/a><\/noindex>.<\/i><\/p>\n<h2>Rezult\u0101ti<\/h2>\n<p><\/p>\n<h4>Sinhronais re\u017e\u012bms<\/h4>\n<p>\nTarantool protokols izmanto bin\u0101ro form\u0101tu <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> zi\u0146u serializ\u0113\u0161anai. PECL savienot\u0101j\u0101 serializ\u0101cija ir dzi\u013ci nosl\u0113pta bibliot\u0113kas iek\u0161ien\u0113, un ietekm\u0113t kod\u0113\u0161anas procesu no userland koda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">nav iesp\u0113jams<\/a><\/noindex>. PHP t\u012bkla savienot\u0101js, savuk\u0101rt, sniedz iesp\u0113ju piel\u0101got kod\u0113\u0161anas procesu, izmantojot standarta kod\u0113t\u0101ju papla\u0161in\u0101jumu vai savas implement\u0101cijas izmanto\u0161anu. No kastes ir pieejami divi kod\u0113t\u0101ji, viens balst\u012bts uz <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (ofici\u0101lais MessagePack PECL papla\u0161in\u0101jums), otrs \u2014 uz <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (t\u012bra PHP versija).<\/p>\n<p>Pirms sal\u012bdzin\u0101\u0161anas savienot\u0101jiem, izm\u0113r\u0101m MessagePack kod\u0113t\u0101ju veiktsp\u0113ju PHP savienot\u0101jam, un t\u0101l\u0101kajos testos izmantosim to, kur\u0161 par\u0101d\u012bs lab\u0101ko rezult\u0101tu:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLai gan PHP versija (Pure) ir l\u0113n\u0101ka nek\u0101 PECL papla\u0161in\u0101jums, es joproj\u0101m ieteiktu izmantot tie\u0161i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, jo ofici\u0101laj\u0101 MessagePack papla\u0161in\u0101jum\u0101 form\u0101ta specifik\u0101cija ir \u012bstenota tikai da\u013c\u0113ji (piem\u0113ram, nav atbalsta piel\u0101gotajiem datu tipiem, bez kuriem j\u016bs nesp\u0113siet izmantot Decimal \u2014 jauno datu tipu, kas tika ieviests Tarantool 2.3) un tas satur vair\u0101kas citas <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">probl\u0113m\u0101m<\/a><\/noindex> (ieskaitot sader\u012bbas probl\u0113mas ar PHP 7.4). Un visp\u0101r, projekts izskat\u0101s pamests.<\/p>\n<p>T\u0101tad, izm\u0113r\u012bsim savienot\u0101ju veiktsp\u0113ju sinhronaj\u0101 re\u017e\u012bm\u0101:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u0101 redzams diagramm\u0101, PECL (Tarantool) savienot\u0101js r\u0101da lab\u0101ku veiktsp\u0113ju sal\u012bdzin\u0101jum\u0101 ar PHP (Client) savienot\u0101ju. Bet tas nav p\u0101rsteidzo\u0161i, \u0146emot v\u0113r\u0101, ka p\u0113d\u0113jais, ne tikai tiek \u012bstenots l\u0113n\u0101k\u0101 valod\u0101, bet faktiski veic vair\u0101k darba: katr\u0101 izsaukum\u0101 tiek izveidots jauns objekts <i>Piepras\u012bjums<\/i> un <i>Response<\/i> (izv\u0113les gad\u012bjum\u0101 \u2014 v\u0113l ar\u012b <i>Criteria<\/i>, bet atjaunin\u0101\u0161anas\/iepriek\u0161\u0113j\u0101s ievieto\u0161anas gad\u012bjum\u0101 \u2014 <i>Operations<\/i>), atsevi\u0161\u0137\u0101m ent\u012bt\u0113m <i>Connection<\/i>, <i>Packer <\/i>un <i>Handler<\/i> t\u0101pat pievieno papildus slodzi. Ac\u012bmredzami, ka par elast\u012bbu n\u0101kas maks\u0101t. Tom\u0113r kopum\u0101 PHP interpretators r\u0101da labu veiktsp\u0113ju, lai gan at\u0161\u0137ir\u012bbas past\u0101v, t\u0101s nav noz\u012bm\u012bgas un, iesp\u0113jams, b\u016bs v\u0113l maz\u0101kas, izmantojot priek\u0161roc\u012bbas ar PHP 7.4, nerun\u0101jot par JIT PHP 8.<\/p>\n<p>Virz\u0101mies t\u0101l\u0101k. Tarantool 2.0 ieguva SQL atbalstu. M\u0113\u0123in\u0101sim izpild\u012bt Select, Insert, Update un Delete oper\u0101cijas, izmantojot SQL protokolu, un sal\u012bdzin\u0101sim rezult\u0101tus ar noSQL (bin\u0101rajiem) ekvivalentiem:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSQL rezult\u0101ti nav \u012bpa\u0161i iespaid\u012bgi (atg\u0101dinu, ka m\u0113s joproj\u0101m test\u0113jam sinhrono re\u017e\u012bmu). Tom\u0113r es negrib\u0113tu par to satraukties pirms laika, SQL atbalsts joproj\u0101m ir akt\u012bv\u0101 izstr\u0101d\u0113 (sal\u012bdzino\u0161i nesen tika pievienots atbalsts <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>), un, sprie\u017eot p\u0113c saraksta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL dzin\u0113js n\u0101kotn\u0113 gaida virkni optimiz\u0101ciju.<\/p>\n<h4>Async<\/h4>\n<p>\nNu, apl\u016bkosim, k\u0101 papla\u0161in\u0101jums Async var pal\u012bdz\u0113t uzlabot iepriek\u0161\u0113jos rezult\u0101tus. Lai rakst\u012btu asinkron\u0101s programmas, papla\u0161in\u0101jums nodro\u0161ina API, kas balst\u012bts uz korut\u012bn\u0101m (coroutines), un m\u0113s to izmantosim. Eksperiment\u0101li noskaidrojam, ka optim\u0101lais korut\u012bnu skaits m\u016bsu vid\u0113 ir 25:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00abIzklied\u0113jam\u00bb 10,000 oper\u0101cijas starp 25 korut\u012bn\u0101m un skat\u0101mies, kas izn\u0101k:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOper\u0101ciju skaits sekund\u0113 pieauga vair\u0101k nek\u0101 tr\u012bs reizes priek\u0161 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Diem\u017e\u0113l PECL savienot\u0101js nepalai\u017eas ar ext-async.<\/p>\n<p>Bet k\u0101 ir ar SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u0101 redzat, asinkronaj\u0101 re\u017e\u012bm\u0101 at\u0161\u0137ir\u012bba starp bin\u0101ro protokolu un SQL ir pie\u013caujam\u0101s k\u013c\u016bdas robe\u017e\u0101s.<\/p>\n<h4>Swoole<\/h4>\n<p>\nAtkal noskaidrojam optim\u0101lo korut\u012bnu skaitu, tagad jau Swoole:<br \/>\n<img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nApst\u0101simies pie 25. Atk\u0101rtojam to pa\u0161u triku, ko ar papla\u0161in\u0101jumu Async \u2015 izkais\u0101m 10,000 oper\u0101cijas starp 25 korut\u012bn\u0101m. Papildus tam pievienosim v\u0113l vienu testu, kur\u0101 visu darbu sadal\u0101m uz 2 procesiem (proti, katrs process veiks 5,000 oper\u0101cijas 25 korut\u012bn\u0101s). Procesi tiks izveidoti, izmantojot <i>SwooleProcess<\/i>. <\/p>\n<p>Rezult\u0101ti:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole r\u0101da nedaudz zem\u0101ku rezult\u0101tu sal\u012bdzin\u0101jum\u0101 ar Async, ja to palai\u017e vien\u0101 proces\u0101, bet ar 2 procesiem aina main\u0101s kardin\u0101li (skaitlis 2 nav izv\u0113l\u0113ts nejau\u0161i, man\u0101 ma\u0161\u012bn\u0101 tie\u0161i 2 procesi par\u0101d\u012bja lab\u0101ko rezult\u0101tu).<\/p>\n<p><i>P.S. Papla\u0161in\u0101jum\u0101 Async ir ar\u012b API darbam ar procesiem, ta\u010du tur es nepaman\u012bju nek\u0101du at\u0161\u0137ir\u012bbu no benchmarku palai\u0161anas vien\u0101 vai vair\u0101kos procesos (nav izsl\u0113gts, ka es kaut kur k\u013c\u016bd\u012bjos).<\/i><\/p>\n<p>SQL pret bin\u0101ro protokolu:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nT\u0101pat k\u0101 ar Async, at\u0161\u0137ir\u012bba starp bin\u0101raj\u0101m un SQL oper\u0101cij\u0101m samazin\u0101s asinkronaj\u0101 re\u017e\u012bm\u0101.<\/p>\n<h4>Parallel<\/h4>\n<p>\nT\u0101 k\u0101 papla\u0161in\u0101jums Parallel neattiecas uz korut\u012bn\u0101m, bet uz pavedieniem, izm\u0113r\u012bsim optim\u0101lo paral\u0113lo pavedienu skaitu:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTas ir 16 man\u0101 ma\u0161\u012bn\u0101. Palai\u017eam savienot\u0101ju benchmarkus uz 16 paral\u0113liem pavedieniem:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nK\u0101 redzat, rezult\u0101ts ir pat lab\u0101ks nek\u0101 ar asinkronajiem papla\u0161in\u0101jumiem (iz\u0146emot Swoole, kas darbojas uz 2 procesiem). Piev\u0113rsiet uzman\u012bbu, ka PECL savienot\u0101jam viet\u0101s, kur bija Update un Upsert oper\u0101cijas, ir tuk\u0161i. Tas saist\u012bts ar to, ka \u0161\u012bs oper\u0101cijas izg\u0101z\u0101s ar k\u013c\u016bdu \u2014 nezinu, vai par to ir atbild\u012bgs ext-parallel, ext-tarantool vai abi.<\/p>\n<p>Tagad sal\u012bdzin\u0101sim SQL veiktsp\u0113ju:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPaman\u012bj\u0101t l\u012bdz\u012bbu ar grafiku savienot\u0101jiem, kas darbojas sinhroni?<\/p>\n<h4>Viss kop\u0101<\/h4>\n<p>\nUn visbeidzot, apvienosim visus rezult\u0101tus vien\u0101 grafik\u0101, lai redz\u0113tu kop\u0113jo ainu par test\u0113tajiem papla\u0161in\u0101jumiem. Grafik\u0101 pievienosim tikai vienu jaunu testu, kuru v\u0113l neesam veiku\u0161i \u2014 palaid\u012bsim korut\u012bnas Async paral\u0113li, izmantojot Parallel*. Ideja par iepriek\u0161min\u0113to papla\u0161in\u0101jumu integr\u0101ciju jau <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">tika apspriesta<\/a><\/noindex> autoru vid\u016b, ta\u010du konsenss netika pan\u0101kts, t\u0101p\u0113c n\u0101ksies to izdar\u012bt pa\u0161iem. <\/p>\n<p><i>* Palaist Swoole korut\u012bnas ar Parallel neizdev\u0101s, \u0161\u0137iet, ka \u0161ie papla\u0161in\u0101jumi nav savietojami.<\/i><\/p>\n<p>T\u0101d\u0113j\u0101di, gal\u012bgie rezult\u0101ti:<\/p>\n<p><img decoding=\"async\" alt=\"Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Nosl\u0113gum\u0101<\/h2>\n<p>\nManupr\u0101t, rezult\u0101ti ir diezgan cien\u012bjami, un k\u0101d\u0101 veid\u0101 esmu p\u0101rliecin\u0101ts, ka tas v\u0113l nav gals! Vai tas jums ir nepiecie\u0161ams re\u0101laj\u0101 projekt\u0101, izlemj tikai jums pa\u0161iem, varu teikt tikai to, ka man tas bija interesants eksperiments, kas \u013c\u0101va nov\u0113rt\u0113t, cik daudz var \u201eizspiest\u201d no sinhron\u0101 TCP savienot\u0101ja ar minim\u0101l\u0101m p\u016bl\u0113m. Ja jums ir idejas par benchmark uzlabo\u0161anu, es labpr\u0101t izskat\u012b\u0161u j\u016bsu piepras\u012bjumu. Visi kods ar palai\u0161anas instrukcij\u0101m un rezult\u0101tiem ir public\u0113ts atsevi\u0161\u0137\u0101 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozitorij\u0101<\/a><\/noindex>.<br \/>\n<br \/>Avots: <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.5 - 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\/lv\/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.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/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\udd47Pa\u0101trin\u0101m PHP savienot\u0101jus Tarantool ar Async, Swoole un Parallel | ProHoster","description":"PHP ekosist\u0113m\u0101.","canonical_url":"https:\/\/prohoster.info\/lv\/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":"lv_LV","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\/lv\/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\/lv\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/lv\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}