{"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\/it\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNell'ecosistema PHP attualmente esistono due connettori per lavorare con il server Tarantool: si tratta dell'estensione ufficiale PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, scritta in C, e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, scritta in PHP. Io sono l'autore di quest'ultima.<\/p>\n<p>In questo articolo vorrei condividere i risultati dei test di prestazione di entrambe le librerie e mostrare come, con minime modifiche al codice, sia possibile ottenere un incremento delle prestazioni del 3-5% (<i>su test sintetici!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Cosa testeremo?<\/h2>\n<p>\nTesteremo i connettori menzionati sopra <i>sincronici<\/i> , eseguiti in modo asincrono, parallelamente e asincrono-parallelamente. \ud83d\ude42 Inoltre, non vogliamo toccare il codice dei connettori stessi. Attualmente sono disponibili diverse estensioni che consentono di raggiungere l'obiettivo desiderato:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 un framework asincrono ad alte prestazioni per PHP. Utilizzato da giganti del web come Alibaba e Baidu. A partire dalla versione 4.1.0 \u00e8 stato introdotto il metodo magico <i>SwooleRuntime::enableCoroutine()<\/i>, che consente di \"trasformare le librerie di rete PHP sincroniche in asincrone\" con una sola riga di codice.\n<\/li>\n<li>Async \u2015 fino a poco tempo fa, un'estensione molto promettente per il lavoro asincrono in PHP. Perch\u00e9 fino a poco tempo fa? Purtroppo, per una ragione a me sconosciuta, l'autore ha eliminato il repository e il futuro del progetto \u00e8 incerto. Dovremo utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">uno<\/a><\/noindex> da fork. Come Swoole, questa estensione permette di trasformare facilmente i pantaloni in un'implementazione asincrona sostituendo le versioni standard dei flussi TCP e TLS con le loro versioni asincrone. Questo avviene attraverso l'opzione &#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 un'estensione relativamente nuova dell'illustre Joe Watkins, autore di librerie come phpdbg, apcu, pthreads, pcov, uopz. L'estensione fornisce API per il lavoro multithreading in PHP ed \u00e8 posizionata come una sostituzione di pthreads. Un'importante limitazione della libreria \u00e8 che funziona solo con la versione PHP ZTS (Zend Thread Safe).\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Come testeremo?<\/h2>\n<p>\nAvviamo un'istanza di Tarantool&#8217; con il logging della scrittura anticipata disabilitato (<i>wal_mode = none<\/i>) e un buffer di rete aumentato (<i>readahead = 1 * 1024 * 1024<\/i>). La prima opzione escluder\u00e0 l'accesso al disco, la seconda consentir\u00e0 di recuperare pi\u00f9 richieste dal buffer del sistema operativo, minimizzando cos\u00ec il numero di chiamate di sistema.<\/p>\n<p>Per i benchmark che lavorano con i dati (inserimento, eliminazione, lettura, ecc.) prima dell'inizio del benchmark verr\u00e0 (ri)creato uno spazio memtx, in cui i valori dell'indice primario sono generati da un generatore di valori interi ordinati (sequence).<br \/>\nDDL dello spazio appare cos\u00ec:<\/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>\nSe necessario, prima dell'avvio del benchmark, lo spazio viene riempito con 10.000 tuple del tipo<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nL'accesso alle tuple avviene tramite un valore di chiave casuale.<\/p>\n<p>Il benchmark consiste in una singola richiesta al server, che viene eseguita 10.000 volte (rivoluzioni), che a loro volta vengono eseguite in iterazioni. Le iterazioni vengono ripetute finch\u00e9 tutte le deviazioni nel tempo tra 5 iterazioni non rientrano nei limiti di tolleranza dell'3 %*. Dopo di che viene preso il risultato medio. Tra le iterazioni c'\u00e8 una pausa di 1 secondo, per evitare che il processore entri in throttling. Il garbage collector Lua \u00e8 disattivato prima di ogni iterazione e forzato a partire dopo il suo completamento. Il processo PHP viene avviato solo con le estensioni necessarie per il benchmark, con il buffering dell'output abilitato e il garbage collector disabilitato.<\/p>\n<p><i>* Il numero di rivoluzioni, iterazioni e soglia di errore pu\u00f2 essere modificato nelle impostazioni del benchmark.<\/i><\/p>\n<h2>Ambiente di test<\/h2>\n<p>\nI risultati pubblicati di seguito sono stati realizzati su MacBookPro (2015), sistema operativo \u2013 Fedora 30 (versione del kernel 5.3.8-200.fc30.x86_64). Tarantool \u00e8 stato avviato in Docker con il parametro &#171;<code>--network host\"<\/code>.<\/p>\n<p>Versioni dei pacchetti:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (build: Oct 22 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch per 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>Sfortunatamente, il connettore ufficiale non funziona con la versione PHP &gt; 7.2. Per compilare e avviare l'estensione su PHP 7.3, \u00e8 stato necessario utilizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Risultati<\/h2>\n<p><\/p>\n<h4>Modalit\u00e0 sincrona<\/h4>\n<p>\nIl protocollo di Tarantool utilizza un formato binario <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> per la serializzazione dei messaggi. Nel connettore PECL la serializzazione \u00e8 nascosta nel profondo della libreria e non \u00e8 possibile influenzare il processo di codifica dal codice userland. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">non si presenta possibile.<\/a><\/noindex>. Il connettore in PHP puro, al contrario, offre la possibilit\u00e0 di personalizzare il processo di codifica estendendo il codificatore standard oppure utilizzando una propria implementazione. Da subito sono disponibili due codificatori, uno basato su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (estensione ufficiale MessagePack PECL), l'altro su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (in PHP puro).<\/p>\n<p>Prima di confrontare i connettori, misureremo le prestazioni dei codificatori MessagePack per il connettore PHP e nei successivi test utilizzeremo quello che mostrer\u00e0 i migliori risultati:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAnche se la versione PHP (Pure) \u00e8 pi\u00f9 lenta rispetto all'estensione PECL, in progetti reali raccomanderei comunque di utilizzare proprio <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, poich\u00e9 nell'estensione ufficiale MessagePack la specifica del formato \u00e8 implementata solo parzialmente (ad esempio, non c'\u00e8 supporto per i tipi di dati personalizzati, senza i quali non puoi utilizzare Decimal \u2014 un nuovo tipo di dati introdotto in Tarantool 2.3) e presenta vari altri <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">di problemi<\/a><\/noindex> (inclusi problemi di compatibilit\u00e0 con PHP 7.4). E in generale, il progetto sembra abbandonato.<\/p>\n<p>Quindi, misuriamo le prestazioni dei connettori in modalit\u00e0 sincrona:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCome si pu\u00f2 vedere dal grafico, il connettore PECL (Tarantool) mostra migliori prestazioni rispetto al connettore PHP (Client). Ma non \u00e8 sorprendente, considerando che quest'ultimo, oltre a essere implementato in un linguaggio pi\u00f9 lento, svolge, di fatto, un lavoro maggiore: ad ogni chiamata viene creato un nuovo oggetto <i>Request<\/i> e <i>Response<\/i> (nel caso di Select \u2014 anche <i>Criteria<\/i>, e nel caso di Update\/Upsert \u2014 <i>Operations<\/i>), le entit\u00e0 separate <i>Connection<\/i>, <i>Packer <\/i>e <i>Handler<\/i> aggiungono anche sovraccarico. \u00c8 evidente che per la flessibilit\u00e0 si deve pagare. Tuttavia, in generale, l'interprete PHP mostra buone prestazioni, anche se c'\u00e8 una differenza, essa \u00e8 insignificante e, forse, sar\u00e0 ancora minore utilizzando il preloading in PHP 7.4, senza contare il JIT in PHP 8.<\/p>\n<p>Procediamo. In Tarantool 2.0 \u00e8 stato introdotto il supporto per SQL. Proviamo a eseguire operazioni Select, Insert, Update e Delete utilizzando il protocollo SQL e a confrontare i risultati con i relativi equivalenti noSQL (binari):<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI risultati SQL non sono molto impressionanti (ricordo che stiamo ancora testando la modalit\u00e0 sincrona). Tuttavia, non mi preoccuperei eccessivamente di questo, il supporto per SQL \u00e8 ancora in fase di sviluppo attivo (relativamente di recente, \u00e8 stato aggiunto il supporto per <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) e, a giudicare dalla lista <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, il motore SQL si aspetta una serie di ottimizzazioni in seguito.<\/p>\n<h4>Async<\/h4>\n<p>\nBene, ora vediamo come l'estensione Async pu\u00f2 aiutarci a migliorare i risultati sopra. Per la scrittura di programmi asincroni, l'estensione fornisce un'API basata su coroutine, che utilizzeremo. Dall'esperienza abbiamo scoperto che il numero ottimale di coroutine per il nostro ambiente \u00e8 25:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00abDistribuiamo\u00bb 10.000 operazioni tra 25 coroutine e vediamo cosa abbiamo ottenuto:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl numero di operazioni al secondo \u00e8 aumentato di oltre 3 volte per <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Purtroppo, il connettore PECL non \u00e8 partito con ext-async.<\/p>\n<p>E per quanto riguarda SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCome potete vedere, in modalit\u00e0 asincrona la differenza tra il protocollo binario e SQL \u00e8 diventata trascurabile.<\/p>\n<h4>Swoole<\/h4>\n<p>\nScopriamo di nuovo il numero ottimale di coroutine, questa volta per Swoole:<br \/>\n<img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFermiamoci su 25. Ripetiamo lo stesso trucco che con l'estensione Async \u2015 distribuiamo 10.000 operazioni tra 25 coroutine. Inoltre, aggiungeremo un altro test in cui divideremo il lavoro in 2 processi (ciascun processo eseguir\u00e0 5.000 operazioni in 25 coroutine). I processi verranno creati tramite <i>SwooleProcess<\/i>. <\/p>\n<p>Risultati:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole mostra un risultato leggermente inferiore rispetto ad Async quando eseguito in un unico processo, ma con 2 processi la situazione cambia drasticamente (il numero 2 \u00e8 stato scelto non a caso, sulla mia macchina 2 processi hanno mostrato i migliori risultati).<\/p>\n<p><i>A proposito, anche nell'estensione Async c'\u00e8 un'API per lavorare con i processi, tuttavia non ho notato alcuna differenza nell'esecuzione dei benchmark in un processo o in pi\u00f9 processi (non \u00e8 escluso che abbia fatto qualche errore).<\/i><\/p>\n<p>SQL vs protocollo binario:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCome per Async, anche in modalit\u00e0 asincrona la differenza tra operazioni binarie e SQL si annulla.<\/p>\n<h4>Parallel<\/h4>\n<p>\nPoich\u00e9 l'estensione Parallel non riguarda le coroutine, ma i thread, misuriamo il numero ottimale di thread paralleli:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c8 pari a 16 sulla mia macchina. Eseguiamo i benchmark dei connettori su 16 thread paralleli:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCome potete vedere, il risultato \u00e8 persino migliore rispetto alle estensioni asincrone (escludendo Swoole eseguito su 2 processi). Notate che per il connettore PECL ci sono spazi vuoti per le operazioni di Update e Upsert. Questo \u00e8 dovuto al fatto che queste operazioni sono fallite con un errore \u2015 non so se \u00e8 colpa di ext-parallel, ext-tarantool o di entrambi.<\/p>\n<p>Ora confrontiamo le prestazioni di SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHai notato una somiglianza con il grafico per i connettori eseguiti in modo sincrono?<\/p>\n<h4>Tutto insieme<\/h4>\n<p>\nE infine, riassumiamo tutti i risultati in un unico grafico per vedere il quadro generale delle estensioni testate. Aggiungeremo al grafico solo un nuovo test che non abbiamo ancora eseguito: avvieremo le coroutine Async in parallelo utilizzando Parallel*. L'idea di integrare le suddette estensioni \u00e8 gi\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">stato discussa<\/a><\/noindex> dagli autori, tuttavia non \u00e8 stato raggiunto alcun consenso e dovremo farlo noi stessi. <\/p>\n<p><i>* Non siamo riusciti a eseguire le coroutine Swoole con Parallel, sembra che queste estensioni non siano compatibili.<\/i><\/p>\n<p>Quindi, i risultati finali:<\/p>\n<p><img decoding=\"async\" alt=\"Accelera i connettori PHP per Tarantool utilizzando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>In conclusione<\/h2>\n<p>\nSecondo me, i risultati sono stati piuttosto soddisfacenti e ho come l'impressione che questo non sia ancora il limite! Spetta solo a voi decidere se questo vi serve in un progetto reale; posso solo dire che per me \u00e8 stato un esperimento interessante che ha permesso di capire quanto si pu\u00f2 \"estrarre\" da un connettore TCP sincrono con il minimo sforzo. Se avete idee per migliorare i benchmark, sar\u00f2 felice di considerare la vostra pull request. Tutto il codice con le istruzioni per l'esecuzione e i risultati \u00e8 pubblicato in un <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repository<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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.1.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\/it\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Acceleriamo i connettori PHP per Tarantool con Async, Swoole e Parallel | ProHoster","description":"Ecosistema PHP.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}