{"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\/hr\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nU PHP ekosustavu trenutno postoje dva konektora za rad sa Tarantool serverom \u2015 to je slu\u017ebeni PECL dodatak <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, napisan u C, i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, napisan u PHP. Ja sam autor potonjeg.<\/p>\n<p>U ovom \u010dlanku bih \u017eelio podijeliti rezultate testiranja performansi obiju biblioteka i pokazati kako uz minimalne promjene u kodu mo\u017ee do\u0107i do 3-5% pove\u0107anja performansi (<i>na sinteti\u010dkim testovima!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u0160to \u0107emo testirati?<\/h2>\n<p>\nTestirat \u0107emo ranije spomenute <i>sinkrone<\/i> konektore, pokrenute asinkrono, paralelno i asinkrono-paralelno. \ud83d\ude42 Tako\u0111er ne \u017eelimo dirati sam kod konektora. Trenutno je dostupno nekoliko dodataka koji omogu\u0107uju postizanje \u017eeljenog:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 visokou\u010dinkovit asinkroni okvir za PHP. Koriste ga internetski divovi kao \u0161to su Alibaba i Baidu. Od verzije 4.1.0 uvedena je \u010darobna metoda <i>SwooleRuntime::enableCoroutine()<\/i>, koja \"jednom linijom koda pretvara sinkrone mre\u017ene biblioteke PHP u asinkrone\".\n<\/li>\n<li>Async \u2015 do nedavno vrlo perspektivan dodatak za asinkroni rad u PHP-u. Za\u0161to do nedavno? Na\u017ealost, iz meni nepoznatog razloga, autor je uklonio repozitorij i daljnja sudbina projekta je neizvjesna. Morat \u0107emo se poslu\u017eiti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">jednim<\/a><\/noindex> iz forkova. Kao \u0161to i Swoole, ovo pro\u0161irenje omogu\u0107ava lako pretvaranje brisa u asinkronos kroz zamjenu standardne implementacije TCP i TLS niti s njihovim asinkronim verzijama. To se posti\u017ee putem opcije &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 prili\u010dno novi dodatak od poznatog Joea Watkina, autora knji\u017enica kao \u0161to su phpdbg, apcu, pthreads, pcov, uopz. Dodatak pru\u017ea API za vi\u0161edretvenog rada u PHP-u i pozicionira se kao zamjena za pthreads. Zna\u010dajno ograni\u010denje knji\u017enice je to \u0161to radi samo s ZTS (Zend Thread Safe) verzijom PHP-a.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kako \u0107emo testirati?<\/h2>\n<p>\nPokrenimo instancu Tarantoola s isklju\u010denim dnevnikom unaprijed zapisivanja (<i>wal_mode = none<\/i>) i pove\u0107anom mre\u017enom baferom (<i>readahead = 1 * 1024 * 1024<\/i>). Prva opcija isklju\u010duje rad s diskom, a druga omogu\u0107ava \u010ditanje vi\u0161e zahtjeva iz bafera operativnog sustava i time minimizira broj sistemskih poziva.<\/p>\n<p>Za benchmarke koji rade s podacima (ubacivanje, brisanje, \u010ditanje itd.) prije po\u010detka benchmarka bit \u0107e (ponovno) stvoren memtx-prostor u kojem se vrijednosti primarnog indeksa stvaraju generatorom urednih cijelih brojeva (sekvenca).<br \/>\nDDL prostora izgleda ovako:<\/p>\n<pre><code class=\"lua\">space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})\nspace:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})\nspace:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})<\/code><\/pre>\n<p>\nPo potrebi, prije pokretanja benchmarka, prostor se ispunjava sa 10.000 trokuta u obliku<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nPristup trokutima se ostvaruje kroz nasumi\u010dnu vrijednost klju\u010da.<\/p>\n<p>Sam benchmark predstavlja jedan zahtjev prema serveru, koji se izvr\u0161ava 10.000 puta (revolucija), koje se, zauzvrat, izvr\u0161avaju u iteracijama. Iteracije se ponavljaju sve dok sva odstupanja u vremenu izme\u0111u 5 iteracija ne budu unutar prihvatljive pogre\u0161ke od 3 %*. Nakon toga se uzima prosje\u010dan rezultat. Izme\u0111u iteracija pauza od 1 sekunde, kako se procesor ne bi pregrijao. Lua sakuplja\u010d sme\u0107a se isklju\u010duje prije svake iteracije i prisilno pokre\u0107e nakon njenog zavr\u0161etka. PHP proces se pokre\u0107e samo s potrebnim ekstenzijama za benchmark, s uklju\u010denim me\u0111uspremnikom izlaznih podataka i isklju\u010denim sakuplja\u010dem sme\u0107a.<\/p>\n<p><i>* Broj revolucija, iteracija i prag pogre\u0161ke mo\u017ee se mijenjati u postavkama benchmarka.<\/i><\/p>\n<h2>Testno okru\u017eenje<\/h2>\n<p>\nObjavljeni rezultati u nastavku napravljeni su na MacBookPro (2015), operacijski sustav \u2014 Fedora 30 (verzija jezgre 5.3.8-200.fc30.x86_64). Tarantool je pokrenut u Dockeru s parametrom &#171;<code>--network host\"<\/code>.<\/p>\n<p>Verzije paketa:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (izgra\u0111eno: 22. listopada 2019. 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch za 7.3)*<br \/>\next-msgpack: 2.0.3<br \/>\next-async: 0.3.0-8c1da46<br \/>\next-swoole: 4.4.12<br \/>\next-parallel: 1.1.3<\/p>\n<p>* <i>Na\u017ealost, slu\u017ebeni konektor ne radi s verzijom PHP &gt; 7.2. Da bi se kompilirao i pokrenuo ekstenzija na PHP 7.3, bilo je potrebno koristiti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Rezultati<\/h2>\n<p><\/p>\n<h4>Sinkroni na\u010din<\/h4>\n<p>\nProtokol Tarantoola koristi binarni format <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> za serijalizaciju poruka. U PECL konektoru serijalizacija je duboko skrivena u utrobi biblioteke i utjecati na proces kodiranja iz userland-koda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">nije mogu\u0107e<\/a><\/noindex>. Konektor na \u010distom PHP, s druge strane, omogu\u0107uje prilagodbu procesa kodiranja pro\u0161irenjem standardnog kodera ili mogu\u0107no\u0161\u0107u kori\u0161tenja vlastite implementacije. Iz kutije su dostupna dva kodera, jedan temeljen na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (slu\u017ebeno pro\u0161irenje MessagePack PECL), drugi \u2014 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (na \u010distom PHP-u).<\/p>\n<p>Prije usporedbe konektora, izmjerit \u0107emo performanse MessagePack kodera za PHP konektor, a u daljnjim testovima koristit \u0107emo onaj koji poka\u017ee najbolje rezultate:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIako PHP verzija (Pure) zaostaje za PECL pro\u0161irenjem u brzini, u stvarnim projektima i dalje bih preporu\u010dio kori\u0161tenje <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, jer je u slu\u017ebenom pro\u0161irenju MessagePack specifikacija formata implementirana samo djelomi\u010dno (na primjer, nema podr\u0161ke za korisni\u010dke tipove podataka, bez kojih ne\u0107ete mo\u0107i koristiti Decimal \u2014 novi tip podataka predstavljen u Tarantool 2.3) i ima niz drugih <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problema<\/a><\/noindex> (uklju\u010duju\u0107i probleme s kompatibilno\u0161\u0107u s PHP 7.4). I op\u0107enito, projekt izgleda napu\u0161ten.<\/p>\n<p>Dakle, izmjerimo performanse konektora u sinhronom re\u017eimu:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKao \u0161to se mo\u017ee vidjeti s grafikona, PECL konektor (Tarantool) pokazuje bolje performanse u usporedbi s konektorom na PHP-u (Client). No, to ne iznena\u0111uje, s obzirom na to da potonji, osim \u0161to je implementiran na sporijem jeziku, zapravo obavlja vi\u0161e posla: pri svakom pozivu stvara se novi objekt <i>Request<\/i> i <i>Response<\/i> (u slu\u010daju Select \u2015 jo\u0161 i <i>Criteria<\/i>, a u slu\u010daju Update\/Upsert \u2015 <i>Operations<\/i>), odvojene entitete <i>Connection<\/i>, <i>Packer <\/i>i <i>Handler<\/i> tako\u0111er dodaje dodatno optere\u0107enje. O\u010dito je da za fleksibilnost treba platiti. Me\u0111utim, op\u0107enito, PHP interpreter pokazuje dobre performanse, iako razlika postoji, ona nije zna\u010dajna i mo\u017eda \u0107e biti jo\u0161 manja kori\u0161tenjem preloading-a u PHP 7.4, ne spominju\u0107i JIT u PHP 8.<\/p>\n<p>Idemo dalje. U Tarantool 2.0 dodana je podr\u0161ka za SQL. Poku\u0161ajmo izvr\u0161iti operacije Select, Insert, Update i Delete koriste\u0107i SQL protokol i usporedimo rezultate s noSQL (binarnih) ekvivalentima:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRezultati SQL-a nisu previ\u0161e impresivni (podsje\u0107am da jo\u0161 uvijek testiramo sinhroni re\u017eim). Me\u0111utim, ne bih se previ\u0161e brinuo zbog toga unaprijed, podr\u0161ka za SQL je jo\u0161 uvijek u aktivnom razvoju (relativno nedavno, na primjer, dodana je podr\u0161ka za <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) i, sude\u0107i po popisu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL engine o\u010dekuje niz optimizacija.<\/p>\n<h4>Asinkrono<\/h4>\n<p>\nPa da vidimo kako \u0107e pro\u0161irenje Asinkrono pomo\u0107i u pobolj\u0161anju gornjih rezultata. Za pisanje asinkronih programa pro\u0161irenje pru\u017ea API temeljen na korutinama, koji \u0107emo iskoristiti. Eksperimenti\u0161emo i utvr\u0111ujemo da je optimalan broj korutina za na\u0161e okru\u017eenje 25:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00bbRaspore\u0111ujemo\u00ab 10,000 operacija me\u0111u 25 korutina i gledamo \u0161to smo postigli:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBroj operacija u sekundi pove\u0107an je vi\u0161e od 3 puta za <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Na\u017ealost, PECL konektor se nije pokrenuo s ext-async.<\/p>\n<p>A \u0161to je s SQL-om?<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKao \u0161to vidite, u asinkronom re\u017eimu razlika izme\u0111u binarnog protokola i SQL-a postala je unutar gre\u0161ke.<\/p>\n<h4>Swoole<\/h4>\n<p>\nPonovo utvr\u0111ujemo optimalan broj korutina, sada za Swoole:<br \/>\n<img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOsta\u0107emo na 25. Ponovimo istu stvar kao i s pro\u0161irenjem Asinkrono \u2015 raspodelimo 10,000 operacija me\u0111u 25 korutina. Osim toga, dodajemo jo\u0161 jedan test, u kojem \u0107emo podeliti sav rad na 2 procesa (tj. svaki proces \u0107e izvr\u0161iti 5,000 operacija u 25 korutina). Procesi \u0107e se kreirati pomo\u0107u <i>SwooleProcess<\/i>. <\/p>\n<p>Rezultati:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole pokazuje malo ni\u017ei rezultat u pore\u0111enju s Asinkronim kada se pokre\u0107e u jednom procesu, ali s 2 procesa situacija se drasti\u010dno menja (broj 2 nije izabran slu\u010dajno, na mojoj ma\u0161ini su ba\u0161 2 procesa pokazala najbolje rezultate).<\/p>\n<p><i>Usput, i u pro\u0161irenju Asinkrono postoji API za rad s procesima, me\u0111utim, nisam primetio razliku u pokretanju benchmarkova u jednom ili vi\u0161e procesa (nije isklju\u010deno da sam napravio neku gre\u0161ku).<\/i><\/p>\n<p>SQL vs binarni protokol:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKao i s Asinkronim, razlika izme\u0111u binarnih i SQL operacija se smanjuje u asinkronom re\u017eimu.<\/p>\n<h4>Parallel<\/h4>\n<p>\nBudu\u0107i da pro\u0161irenje Paralelno nije o korutinama, ve\u0107 o procesima, izmeri\u0107emo optimalan broj paralelnih procesa:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOn iznosi 16 na mojoj ma\u0161ini. Pokrenimo benchmarke konektora na 16 paralelnih procesa:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nKao \u0161to vidite, rezultat je \u010dak i bolji nego s asinkronim pro\u0161irenjima (ne ra\u010dunaju\u0107i Swoole pokrenut na 2 procesa). Imajte na umu da za PECL konektor na mestima Update i Upsert operacija nema podataka. To je zbog toga \u0161to su te operacije zavr\u0161ile gre\u0161kom \u2015 ne znam da li je krivnja ext-parallel, ext-tarantool ili obojica.<\/p>\n<p>Sada uporedimo performanse SQL-a:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPrimijetili ste sli\u010dnost s grafikom za konektore pokrenute sinkrono?<\/p>\n<h4>Sve zajedno<\/h4>\n<p>\nNa kraju, sa\u017eet \u0107emo sve rezultate u jedan grafikon kako bismo vidjeli cjelokupnu sliku za testirane ekstenzije. Na grafikon \u0107emo dodati samo jedan novi test koji do sada nismo radili - pokrenut \u0107emo Async korutine paralelno s Parallel*. Ideja integracije gore spomenutih ekstenzija ve\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">je raspravljana<\/a><\/noindex> od strane autora, ali konsenzus nije postignut, morat \u0107emo to u\u010diniti sami. <\/p>\n<p><i>* Nije uspjelo pokrenuti Swoole korutine s Parallel, \u010dini se da su ove ekstenzije nespojive.<\/i><\/p>\n<p>Dakle, kona\u010dni rezultati:<\/p>\n<p><img decoding=\"async\" alt=\"Ubrzanje PHP konektora za Tarantool uz Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Umjesto zaklju\u010dka<\/h2>\n<p>\nPo mom mi\u0161ljenju, rezultati su prili\u010dno dobri i nekako sam uvjeren da to jo\u0161 nije max! Trebate li to u stvarnom projektu, isklju\u010divo je na vama da donesete odluku, samo \u0107u re\u0107i da je za mene ovo bio zanimljiv eksperiment koji omogu\u0107ava procjenu koliko se mo\u017ee \"izvu\u0107i\" iz sinkroniziranog TCP konektora uz minimalan trud. Ako imate ideje za pobolj\u0161anje benchmarkova - rado \u0107u razmotriti va\u0161 pull request. Sav kod s uputama za pokretanje i rezultatima objavljen je u zasebnom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozitoriju<\/a><\/noindex>.<br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478336\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53530","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Ubrzavamo PHP konektore za Tarantool uz pomo\u0107 Async, Swoole i Parallel | ProHoster","description":"Ekosustavu PHP.","canonical_url":"https:\/\/prohoster.info\/hr\/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":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}