{"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":"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAttualmente, nell'ecosistema PHP ci sono due connettori per lavorare con il server Tarantool: l'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. Sono l'autore di quest'ultima.<\/p>\n<p>In questo articolo, vorrei condividere i risultati dei test sulle performance di entrambe le librerie e mostrare come, con piccole modifiche al codice, si possa ottenere un incremento delle performance del 3-5% (<i>in test sintetici!)<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Cosa testeremo?<\/h2>\n<p>\nTesteremo i connettori suddetti <i>synchroni<\/i> lanciati in modalit\u00e0 asincrona, parallela e asincrona-parallela. \ud83d\ude42 Inoltre, non vogliamo toccare il codice stesso dei connettori. Attualmente sono disponibili diverse estensioni che permettono di ottenere il risultato desiderato:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u00e8 un framework asincrono ad alte prestazioni per PHP. Utilizzato da giganti di Internet come Alibaba e Baidu. Con la versione 4.1.0 \u00e8 stato introdotto il metodo magico <i>SwooleRuntime::enableCoroutine()<\/i>, che consente \"con una sola riga di codice di trasformare le librerie di rete sincrone di PHP in asincrone\".\n<\/li>\n<li>Async \u2015 fino a poco tempo fa era un'espansione promettente per il lavoro asincrono in PHP. Perch\u00e9 fino a poco tempo fa? Sfortunatamente, per ragioni a me sconosciute, l'autore ha rimosso 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 consente di trasformare facilmente le applicazioni abilitate per l'asincrono sostituendo l'implementazione standard dei flussi TCP e TLS con le loro versioni asincrone. Questo avviene tramite l'opzione &#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 un'estensione abbastanza nuova dell'ormai noto Joe Watkins, autore di librerie come phpdbg, apcu, pthreads, pcov, uopz. Questa estensione fornisce un'API per il lavoro multithreading in PHP e si posiziona come un sostituto di pthreads. Un aspetto significativo di questa libreria \u00e8 che funziona solo con la versione ZTS (Zend Thread Safe) di PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Come testeremo?<\/h2>\n<p>\nAvviamo un'istanza di Tarantool con il journaling delle scritture anticipate disattivato (<i>wal_mode = none<\/i>) e aumenteremo il buffer di rete (<i>readahead = 1 * 1024 * 1024<\/i>). La prima opzione escluder\u00e0 l'uso del disco, la seconda permetter\u00e0 di leggere un numero maggiore di richieste dal buffer del sistema operativo, riducendo cos\u00ec il numero di chiamate di sistema.<\/p>\n<p>Per i benchmark che operano con i dati (inserimento, cancellazione, lettura, ecc.), prima dell'inizio del benchmark verr\u00e0 (ri)creato uno spazio memtx, in cui i valori dell'indice primario vengono generati da un generatore di valori interi ordinati (sequence).<br \/>\nIl DDL 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 di avviare il benchmark, lo spazio viene riempito con 10.000 tuple del tipo<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nL'accesso alle tuple avviene tramite un valore chiave casuale.<\/p>\n<p>Il benchmark consiste in una singola richiesta al server, che viene eseguita 10.000 volte (rivoluzioni), le quali, a loro volta, vengono eseguite in iterazioni. Le iterazioni vengono ripetute finch\u00e9 tutte le deviazioni di tempo tra 5 iterazioni non rientrano nella tolleranza consentita del 3%*. Dopodich\u00e9 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 di Lua \u00e8 disattivato prima di ogni iterazione e avviato forzatamente dopo il suo completamento. Il processo PHP viene avviato solo con le estensioni necessarie per il benchmark, con la buffering dell'output attivata e il garbage collector disattivato.<\/p>\n<p><i>* Il numero di rivoluzioni, iterazioni e il limite di tolleranza possono essere modificati nelle impostazioni del benchmark.<\/i><\/p>\n<h2>Ambiente di test<\/h2>\n<p>\nI risultati pubblicati di seguito sono stati ottenuti su un MacBook Pro (2015), sistema operativo \u2013 Fedora 30 (versione del kernel 5.3.8-200.fc30.x86_64). Tarantool \u00e8 stato eseguito 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) (compilato: 22 Ott 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>Purtroppo, 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 in profondit\u00e0 nella 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 \u00e8 possibile<\/a><\/noindex>. Il connettore in puro PHP, al contrario, offre la possibilit\u00e0 di personalizzare il processo di codifica utilizzando il codificatore standard oppure implementando una propria soluzione. Sono disponibili due codificatori di default, 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 puro PHP).<\/p>\n<p>Prima di confrontare i connettori, misuriamo le prestazioni dei codificatori MessagePack per il connettore PHP e nei test successivi utilizzeremo quello che dar\u00e0 il miglior risultato:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAnche se la versione PHP (Pura) \u00e8 inferiore in velocit\u00e0 rispetto all'estensione PECL, nei progetti reali consiglierei comunque di usare proprio questa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, perch\u00e9 nel formato ufficiale di MessagePack la specifica \u00e8 solo parzialmente implementata (ad esempio, non supporta i tipi di dati personalizzati, senza i quali non \u00e8 possibile utilizzare Decimal \u2014 un nuovo tipo di dato introdotto in Tarantool 2.3) e presenta una serie di 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). Inoltre, nel complesso, il progetto appare abbandonato.<\/p>\n<p>Quindi, misuriamo le prestazioni dei connettori in modalit\u00e0 sincrona:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando 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 prestazioni migliori rispetto al connettore in PHP (Client). Ma non \u00e8 sorprendente, considerando che quest'ultimo, oltre a essere implementato in un linguaggio pi\u00f9 lento, effettua, di fatto, pi\u00f9 lavoro: ad ogni chiamata viene creato un nuovo oggetto <i>Richiesta<\/i> e <i>Risposta<\/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 overhead. \u00c8 ovvio che per la flessibilit\u00e0 si paga un prezzo. Tuttavia, nel complesso, l'interprete PHP mostra buone prestazioni, anche se c'\u00e8 una differenza, ma \u00e8 insignificante e, probabilmente, sar\u00e0 ancora minore con l'uso del preloading in PHP 7.4, per non parlare di JIT in PHP 8.<\/p>\n<p>Andiamo avanti. In Tarantool 2.0 \u00e8 stata introdotta la supporto per SQL. Proviamo a eseguire operazioni Select, Insert, Update e Delete utilizzando il protocollo SQL e confrontiamo i risultati con gli equivalenti noSQL (binari):<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI risultati di SQL non sono particolarmente impressionanti (ricordo che stiamo ancora testando la modalit\u00e0 sincrona). Tuttavia, non mi preoccuperei troppo di questo, poich\u00e9 il supporto per SQL \u00e8 ancora in fase di sviluppo attivo (di recente, ad esempio, \u00e8 stata aggiunta la supporto per <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) e, da quello che vediamo nella 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 subir\u00e0 a breve una serie di ottimizzazioni.<\/p>\n<h4>Async<\/h4>\n<p>\nBene, vediamo ora come l'estensione Async pu\u00f2 aiutarci a migliorare i risultati sopra. Per scrivere programmi asincroni, l'estensione fornisce un'API basata su coroutine, che utilizzeremo. Attraverso esperimenti, abbiamo scoperto che il numero ottimale di coroutine per il nostro ambiente \u00e8 25:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDistribuiamo 10.000 operazioni su 25 coroutine e vediamo cosa ne \u00e8 uscito:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando 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>\u00c8 triste, ma il connettore PECL non si \u00e8 avviato con ext-async.<\/p>\n<p>E per quanto riguarda SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando 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>\nAdesso stiamo valutando il numero ottimale di coroutine, questa volta per Swoole:<br \/>\n<img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nFermiamoci a 25. Ripetiamo lo stesso trucco usato con l'estensione Async: distribuiremo 10.000 operazioni tra 25 coroutine. Inoltre, aggiungeremo un altro test, in cui divideremo tutto il lavoro in 2 processi (cio\u00e8 ogni processo eseguir\u00e0 5.000 operazioni in 25 coroutine). I processi saranno creati utilizzando <i>SwooleProcess<\/i>. <\/p>\n<p>Risultati:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando 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 singolo processo, ma con 2 processi la situazione cambia drasticamente (il numero 2 \u00e8 stato scelto non a caso, sulla mia macchina proprio 2 processi hanno mostrato i migliori risultati).<\/p>\n<p><i>A proposito, anche nell'estensione Async esiste un'API per lavorare con i processi, tuttavia non ho notato alcuna differenza nell'esecuzione dei benchmark in un singolo o pi\u00f9 processi (non escludo che possa aver commesso qualche errore).<\/i><\/p>\n<p>SQL vs protocollo binario:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCos\u00ec come per Async, la differenza tra le operazioni binarie e SQL viene attenuata in modalit\u00e0 asincrona.<\/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=\"Acceleriamo i connettori PHP per Tarantool usando 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=\"Acceleriamo i connettori PHP per Tarantool usando 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 addirittura migliore rispetto alle estensioni asincrone (escludendo Swoole avviato su 2 processi). Notate che per il connettore PECL non ci sono operazioni di Update e Upsert. Questo \u00e8 dovuto al fatto che tali operazioni hanno restituito un errore \u2014 non so se sia colpa di ext-parallel, ext-tarantool o di entrambi.<\/p>\n<p>Adesso confrontiamo le prestazioni SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNotate la somiglianza con il grafico per i connettori eseguiti in modo sincrono?<\/p>\n<h4>Tutto insieme<\/h4>\n<p>\nE per finire, 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 effettuato \u2014 eseguiremo coroutine Async in parallelo utilizzando Parallel*. L'idea di integrare le estensioni sopraccitate \u00e8 gi\u00e0 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">stata discussa<\/a><\/noindex> dagli autori, tuttavia non \u00e8 stato raggiunto un consenso, dovremo farlo da soli. <\/p>\n<p><i>* Non sono riuscito 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=\"Acceleriamo i connettori PHP per Tarantool usando Async, Swoole e Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>In conclusion<\/h2>\n<p>\nCredo che i risultati siano decisamente soddisfacenti e sono sicuro che non sia ancora il limite! Se sia necessario per il vostro progetto reale, spetta solo a voi decidere; posso solo dire che per me \u00e8 stato un esperimento interessante che ha permesso di valutare quanto si possa \"estrarre\" da un connettore TCP sincrono con il minimo sforzo. Se avete idee per migliorare i benchmark, esaminer\u00f2 con piacere la vostra pull request. Tutto il codice con le istruzioni per l'esecuzione e i risultati \u00e8 pubblicato in un separato <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.0.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.0.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":"Nell'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}]}}