{"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\/da\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI \u00f8kosystemet PHP findes der i \u00f8jeblikket to forbindelser til at arbejde med Tarantool-serveren - den officielle PECL-udvidelse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, skrevet i C, og <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, skrevet i PHP. Jeg er forfatteren til den sidstn\u00e6vnte.<\/p>\n<p>I denne artikel vil jeg dele resultaterne af ydelsestestene af begge biblioteker og vise, hvordan man kan opn\u00e5 en forbedring p\u00e5 3-5 i ydeevne med minimale \u00e6ndringer i koden (<i>p\u00e5 syntetiske tests!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Hvad skal vi teste?<\/h2>\n<p>\nVi vil teste de f\u00f8rn\u00e6vnte <i>synkrone<\/i> forbindelser, der k\u00f8res asynkront, parallelt og asynkront-parallelt. \ud83d\ude42 Vi \u00f8nsker heller ikke at \u00e6ndre koden i selve forbindelserne. I \u00f8jeblikket er der flere udvidelser, der kan hj\u00e6lpe med at opn\u00e5 det \u00f8nskede:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2014 en h\u00f8jtydende asynkron ramme for PHP. Bruges af internetgiganterne som Alibaba og Baidu. Fra version 4.1.0 er der tilf\u00f8jet en magisk metode <i>SwooleRuntime::enableCoroutine()<\/i>, der giver mulighed for \u00abmed en enkelt kodelinje at konvertere synkrone netv\u00e6rksbiblioteker i PHP til asynkrone\u00bb.\n<\/li>\n<li>Async \u2014 indtil for nylig en lovende udvidelse til asynkron arbejde i PHP. Hvorfor indtil for nylig? Desv\u00e6rre har forfatteren af en ukendt grund slettet sit repository, og projektets fremtid er usikker. Vi m\u00e5 bruge <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">en<\/a><\/noindex> fra forks. Ligesom Swoole tillader denne udvidelse dig nemt at transformere dine bukser til at inkludere asynkronitet ved at erstatte standardimplementeringen af TCP og TLS-str\u00f8mme med deres asynkrone versioner. Dette g\u00f8res gennem muligheden &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2014 en forholdsvis ny udvidelse fra den velkendte Joe Watkins, forfatter til biblioteker som phpdbg, apcu, pthreads, pcov, uopz. Denne udvidelse leverer et API til multitr\u00e5dede operationer i PHP og er positioneret som en erstatning for pthreads. En v\u00e6sentlig begr\u00e6nsning ved biblioteket er, at det kun fungerer med ZTS (Zend Thread Safe) versionen af PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hvordan vil vi teste?<\/h2>\n<p>\nLad os starte en instance af Tarantool uden forsinket skrivejournal (<i>wal_mode = none<\/i>) og en for\u00f8get netv\u00e6rksbuffer (<i>readahead = 1 * 1024 * 1024<\/i>). Den f\u00f8rste mulighed vil udelukke arbejde med disken, den anden vil give mulighed for at indl\u00e6se flere foresp\u00f8rgsler fra operativsystemets buffer og dermed minimere antallet af systemopkald.<\/p>\n<p>Til benchmarks, der arbejder med data (inds\u00e6ttelse, sletning, l\u00e6sning osv.), vil der f\u00f8r benchmark-start blive (gen)oprettet et memtx-space, hvor v\u00e6rdierne for den prim\u00e6re indeks oprettes af en generator af ordnede heltal (sequence).<br \/>\nDDL-space ser s\u00e5dan ud:<\/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>\nOm n\u00f8dvendigt, f\u00f8r benchmark-starten, fyldes space med 10.000 tuples af typen<\/p>\n<pre><code class=\"lua\">{id, \"tuple_\"}<\/code><\/pre>\n<p>\nAdgang til tuples sker efter en tilf\u00e6ldig v\u00e6rdi af n\u00f8gle.<\/p>\n<p>Selve benchmarken udg\u00f8r en enkelt anmodning til serveren, som udf\u00f8res 10.000 gange (rotationer), som igen udf\u00f8res i iterationer. Iterationerne gentages, indtil alle tidsafvigelser mellem 5 iterationer ligger inden for en tilladt fejlmargin p\u00e5 3 %*. Derefter tages det gennemsnitlige resultat. Der er en pause p\u00e5 1 sekund mellem iterationerne for at undg\u00e5, at processoren falder ned i throttling. Lua's garbage collector deaktiveres f\u00f8r hver iteration og aktiveres tvangsagtigt efter dens afslutning. PHP-processen starter kun med de n\u00f8dvendige udvidelser for benchmarken, med output-buffering aktiveret og garbage collector deaktiveret.<\/p>\n<p><i>* Antallet af rotationer, iterationer og fejlmargin kan \u00e6ndres i benchmarkindstillingerne.<\/i><\/p>\n<h2>Testmilj\u00f8<\/h2>\n<p>\nDe offentliggjorte resultater blev lavet p\u00e5 en MacBookPro (2015), operativsystemet er Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool blev k\u00f8rt i Docker med parameteren &#171;<code>--network host\"<\/code>.<\/p>\n<p>Pakkernes versioner:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (bygget: 22. okt 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch til 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>Desv\u00e6rre fungerer den officielle connector ikke med PHP-versionen &gt; 7.2. For at kunne kompilere og k\u00f8re udvidelsen p\u00e5 PHP 7.3, m\u00e5tte jeg bruge <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Resultater<\/h2>\n<p><\/p>\n<h4>Synkron tilstand<\/h4>\n<p>\nTarantools protokol bruger bin\u00e6rt format <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> til serialisering af beskeder. I PECL-connectoren er serialiseringen skjult langt inde i biblioteket, og det er ikke muligt at p\u00e5virke kodningsprocessen fra userland-kode <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">ikke kan lade sig g\u00f8re.<\/a><\/noindex>. En connector skrevet i ren PHP giver mulighed for at tilpasse kodningsprocessen ved at udvide den standardkode, der anvendes, eller ved at bruge sin egen implementering. Der leveres to kodere fra starten, en baseret p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (officiel MessagePack PECL-udvidelse), den anden \u2014 p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (i ren PHP).<\/p>\n<p>F\u00f8r vi sammenligner connectorerne, vil vi m\u00e5le ydeevnen af MessagePack-kodere til PHP-connectoren og i de videre tests vil vi bruge den, der viser det bedste resultat:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSelvom den PHP-version (Pure) er langsommere end PECL-udvidelsen, vil jeg i virkelige projekter stadig anbefale at bruge <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, fordi den officielle MessagePack-udvidelse kun delvist implementerer formatets specifikation (for eksempel er der ingen st\u00f8tte til brugerdefinerede datatyper, uden hvilke du ikke kan bruge Decimal \u2014 den nye datatype introduceret i Tarantool 2.3) og har en r\u00e6kke andre <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemer<\/a><\/noindex> (herunder kompatibilitetsproblemer med PHP 7.4). Og generelt ser projektet ud til at v\u00e6re forladt.<\/p>\n<p>Lad os m\u00e5le ydeevnen af connectorerne i synkront mode:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom det fremg\u00e5r af diagrammet, viser PECL-connectoren (Tarantool) bedre ydeevne sammenlignet med PHP-connectoren (Client). Men det er ikke overraskende, da sidstn\u00e6vnte, ud over at v\u00e6re implementeret i et langsommere sprog, ogs\u00e5 i virkeligheden laver mere arbejde: der oprettes et nyt objekt ved hver kald <i>Request<\/i> og <i>Svar<\/i> (i tilf\u00e6lde af Select \u2014 ogs\u00e5 <i>Criteria<\/i>, og i tilf\u00e6lde af Update\/Upsert \u2014 <i>Operations<\/i>), separate enheder <i>Connection<\/i>, <i>Packer <\/i>og <i>Handler<\/i> tilf\u00f8jer ogs\u00e5 overhead. Det st\u00e5r klart, at fleksibiliteten koster. Men generelt viser PHP-fortolkeren god ydeevne, selvom der er en forskel, er den ikke betydelig, og m\u00e5ske vil den blive endnu mindre med brugen af preloading i PHP 7.4, for ikke at n\u00e6vne JIT i PHP 8.<\/p>\n<p>Lad os komme videre. I Tarantool 2.0 blev der tilf\u00f8jet SQL-underst\u00f8ttelse. Lad os pr\u00f8ve at udf\u00f8re Select, Insert, Update og Delete-operationer ved hj\u00e6lp af SQL-protokollen og sammenligne resultaterne med noSQL (bin\u00e6re) \u00e6kvivalenter:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nResultaterne fra SQL imponerer ikke meget (jeg minder om, at vi stadig tester synkront mode). Men jeg ville ikke bekymre mig alt for meget om det lige nu, da SQL-support stadig er under aktiv udvikling (for nylig blev der for eksempel tilf\u00f8jet st\u00f8tte til <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) og, if\u00f8lge listen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, venter der en r\u00e6kke optimeringer for SQL-motoren i fremtiden.<\/p>\n<h4>Async<\/h4>\n<p>\nLad os nu se, hvordan Async-udvidelsen kan hj\u00e6lpe os med at forbedre de n\u00e6vnte resultater. For at skrive asynkrone programmer tilbyder udvidelsen et API baseret p\u00e5 korutiner (coroutines), som vi vil bruge. Gennem erfaring finder vi ud af, at det optimale antal korutiner for vores milj\u00f8 er 25:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVi \"fordeler\" 10.000 operationer p\u00e5 25 korutiner og ser, hvad der er kommet ud af det:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAntallet af operationer pr. sekund er steget med mere end 3 gange for <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Desv\u00e6rre kunne PECL-connectoren ikke startes med ext-async.<\/p>\n<p>Og hvad med SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom du kan se, er forskellen mellem bin\u00e6rprotokollen og SQL i asynkront mode inden for m\u00e5lefejl.<\/p>\n<h4>Swoole<\/h4>\n<p>\nVi finder igen det optimale antal korutiner, nu for Swoole:<br \/>\n<img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLad os stoppe ved 25. Vi gentager det samme trick, som med Async-udvidelsen - vi fordeler 10.000 operationer mellem 25 korutiner. Derudover tilf\u00f8jer vi endnu en test, hvor vi deler alt arbejdet mellem 2 processer (det vil sige, at hver proces vil udf\u00f8re 5.000 operationer i 25 korutiner). Processerne vil blive oprettet med hj\u00e6lp af <i>SwooleProcess<\/i>. <\/p>\n<p>Resultater:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole viser et lidt lavere resultat sammenlignet med Async, n\u00e5r det k\u00f8res i \u00e9n proces, men med 2 processer \u00e6ndrer billedet sig dramatisk (tallet 2 er ikke valgt tilf\u00e6ldigt, da 2 processer p\u00e5 min maskine viste det bedste resultat).<\/p>\n<p><i>Forresten, Async-udvidelsen har ogs\u00e5 et API til procesh\u00e5ndtering, men jeg har ikke bem\u00e6rket nogen forskel mellem at k\u00f8re benchmarks i \u00e9n eller flere processer (jeg har sikkert lavet nogen fejl et sted).<\/i><\/p>\n<p>SQL vs bin\u00e6r protokol:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom med Async, udlignes forskellen mellem bin\u00e6re og SQL-operationer i asynkront mode.<\/p>\n<h4>Parallel<\/h4>\n<p>\nEftersom Parallel-udvidelsen ikke handler om korutiner, men om tr\u00e5de, lad os m\u00e5le det optimale antal parallelle tr\u00e5de:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet er 16 p\u00e5 min maskine. Lad os k\u00f8re benchmarks for connectorerne p\u00e5 16 parallelle tr\u00e5de:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom du kan se, er resultatet endda bedre end med de asynkrone udvidelser (bortset fra Swoole k\u00f8rt p\u00e5 2 processer). Bem\u00e6rk, at der ikke er noget for connectoren PECL for Update- og Upsert-operationer. Dette skyldes, at disse operationer fejlede - jeg ved ikke, om det er p\u00e5 grund af ext-parallel, ext-tarantool eller begge.<\/p>\n<p>Lad os nu sammenligne SQL-ydeevnen:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLagde du m\u00e6rke til ligheden med grafen for connectorerne, der blev k\u00f8rt synkront?<\/p>\n<h4>Alt i alt<\/h4>\n<p>\nOg til slut, lad os samle alle resultaterne i en graf, s\u00e5 vi kan se det samlede billede for de testede udvidelser. Vi vil kun tilf\u00f8je \u00e9n ny test til grafen, som vi endnu ikke har lavet - vi vil k\u00f8re Async-korutiner parallelt ved hj\u00e6lp af Parallel*. Id\u00e9en om at integrere de n\u00e6vnte udvidelser er allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">blevet diskuteret<\/a><\/noindex> af forfatterne, men der blev ikke opn\u00e5et nogen enighed, s\u00e5 vi m\u00e5 g\u00f8re det selv. <\/p>\n<p><i>* At k\u00f8re Swoole-korutiner med Parallel var ikke muligt, tilsyneladende er disse udvidelser inkompatible.<\/i><\/p>\n<p>S\u00e5, de endelige resultater:<\/p>\n<p><img decoding=\"async\" alt=\"Accelererer PHP-adaptere til Tarantool med Async, Swoole og Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Afslutning<\/h2>\n<p>\nEfter min mening er resultaterne ret tilfredsstillende, og jeg er af en eller anden grund overbevist om, at dette endnu ikke er gr\u00e6nsen! Om dette er n\u00f8dvendigt for jer i et reelt projekt, er helt op til jer selv, jeg vil blot sige, at for mig var det et interessant eksperiment, der gjorde det muligt at vurdere, hvor meget man kan \"udtr\u00e6kke\" fra en synkron TCP-connector med minimal indsats. Hvis I har ideer til forbedring af benchmarkene - ville jeg med gl\u00e6de overveje jeres pull request. Hele koden med instruktioner til k\u00f8rsel og resultater er offentliggjort i en separat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repository<\/a><\/noindex>.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Accelererer PHP-connectorer til Tarantool ved hj\u00e6lp af Async, Swoole og Parallel | ProHoster","description":"I PHP-\u00f8kosystemet.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}