異步 mysql 客戶端:async-mysql-php
PHP異步并發訪問mysql簡單實現。
在實際的開發過程中,我們常常會遇到需要操作多張表,多個庫的情況。有時因為一些限制我們不能進行連表(例如,異地數據庫),所以只能用php串行訪問后再在php里進行合并,有時還需要模擬mysql對合并后的結果進行排序、歸并等。
這里產生的一個問題就是串行帶來的訪問時間問題。由于傳統的串行訪問方式,我們只能等到一條sql執行完畢后才可以執行下一條,所以執行時間是累加的。PHP官方手冊提供了一種可以異步并發訪問mysql的方式,詳見:http://php.net/manual/zh/mysqli.poll.php,參考資料:https://svn.osgeo.org/mapguide/sandbox/rfc94/Oem/php/ext/mysqli/tests/mysqli_poll.phpt,使用此種方式,我們可以對Mysql進行異步并發訪問,訪問時間不再是串行累加,而是取決于執行時間最長的sql。
項目地址:https://github.com/huyanping/async-mysql-php
代碼示例:
try{ $async_mysql=new\Jenner\Mysql\Async(); $async_mysql->attach( ['host'=>'127.0.0.1','user'=>'root','password'=>'','database'=>'test'], 'select * from stu' ); $async_mysql->attach( ['host'=>'127.0.0.1','user'=>'root','password'=>'','database'=>'test'], 'select * from stu limit 0, 3' ); $result=$async_mysql->execute(); print_r($result); }catch(Exception$e){ echo$e->getMessage(); }
async_mysql對象對mysql進行異步并發訪問,attach方法接收每個請求必須的配置信息,execute方法為執行入口,其返回值是每條sql執行結果的數組,順序與attach調用順序一致。
當任何一個連接mysql出錯或執行任何一條sql出錯,都會引起異常拋出。這樣設計主要是基于完整性的考慮,我們把所有需要執行的sql看做是一個整體事務,任何一個執行失敗,則認為該事務失敗。
composer信息:
"require":{ "jenner/async-mysql-php":"v0.1" }
或者直接引入/path/to/async-mysql-php/autoload.php文件
最后在阿里云上做了一個簡單的測試,測試結果如下:
# 同步 [root@iZ942077c78Z async-mysql-php]# php tests/performance_sync.php ------------------------------------------ mark:[totaldiff] time:4.2648551464081s memory_real:18944KB memory_emalloc:18377.171875KB memory_peak_real:28416KB memory_peak_emalloc:27560.3828125KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_sync.php ------------------------------------------ mark:[totaldiff] time:4.2285549640656s memory_real:18944KB memory_emalloc:18377.171875KB memory_peak_real:28416KB memory_peak_emalloc:27560.3828125KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[totaldiff] time:1.455677986145s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB # 異步 [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[totaldiff] time:1.8936941623688s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[totaldiff] time:1.5208158493042s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB
實際上以上測試結果并沒有太大意義。因為理論上這種異步并發的訪問方式會絕對優于傳統的串行訪問方式,再次需要說明的是,訪問數據庫的時間接近執行時間最長的SQL。
到了這一步,我們已經可以實現對mysql進行異步并發訪問了。如果我們還需要做多個數組的歸并,可以使用《PHP模擬SQL的GROUP BY算法》中介紹的方法。其中提供的歸并方式非常靈活,更勝mysql原生的group by。如果還需要對合并后的結果做排序,可以使用https://github.com/huyanping/Zebra-Tools/blob/master/src/Jenner/Zebra/Tools/CommonArray.php#L90這段代碼實現,非常方便。改函數來源于php手冊http://php.net/manual/zh/function.array-multisort.php
原文地址:PHP異步并發訪問mysql簡單實現