<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          async-mysql-php異步 mysql 客戶端

          聯(lián)合創(chuàng)作 · 2023-09-30 20:42

          PHP異步并發(fā)訪問mysql簡單實現(xiàn)。

          在實際的開發(fā)過程中,我們常常會遇到需要操作多張表,多個庫的情況。有時因為一些限制我們不能進行連表(例如,異地數(shù)據(jù)庫),所以只能用php串行訪問后再在php里進行合并,有時還需要模擬mysql對合并后的結(jié)果進行排序、歸并等。

          這里產(chǎn)生的一個問題就是串行帶來的訪問時間問題。由于傳統(tǒng)的串行訪問方式,我們只能等到一條sql執(zhí)行完畢后才可以執(zhí)行下一條,所以執(zhí)行時間是累加的。PHP官方手冊提供了一種可以異步并發(fā)訪問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進行異步并發(fā)訪問,訪問時間不再是串行累加,而是取決于執(zhí)行時間最長的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進行異步并發(fā)訪問,attach方法接收每個請求必須的配置信息,execute方法為執(zhí)行入口,其返回值是每條sql執(zhí)行結(jié)果的數(shù)組,順序與attach調(diào)用順序一致。

          當(dāng)任何一個連接mysql出錯或執(zhí)行任何一條sql出錯,都會引起異常拋出。這樣設(shè)計主要是基于完整性的考慮,我們把所有需要執(zhí)行的sql看做是一個整體事務(wù),任何一個執(zhí)行失敗,則認為該事務(wù)失敗。

          composer信息:

          "require":{       
              "jenner/async-mysql-php":"v0.1"       
          }

          或者直接引入/path/to/async-mysql-php/autoload.php文件

          最后在阿里云上做了一個簡單的測試,測試結(jié)果如下:

          # 同步         
          [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

          實際上以上測試結(jié)果并沒有太大意義。因為理論上這種異步并發(fā)的訪問方式會絕對優(yōu)于傳統(tǒng)的串行訪問方式,再次需要說明的是,訪問數(shù)據(jù)庫的時間接近執(zhí)行時間最長的SQL。

          到了這一步,我們已經(jīng)可以實現(xiàn)對mysql進行異步并發(fā)訪問了。如果我們還需要做多個數(shù)組的歸并,可以使用《PHP模擬SQL的GROUP BY算法》中介紹的方法。其中提供的歸并方式非常靈活,更勝mysql原生的group by。

          如果還需要對合并后的結(jié)果做排序,可以使用https://github.com/huyanping/Zebra-Tools/blob/master/src/Jenner/Zebra/Tools/CommonArray.php#L90這段代碼實現(xiàn),非常方便。改函數(shù)來源于php手冊http://php.net/manual/zh/function.array-multisort.php

          原文地址:PHP異步并發(fā)訪問mysql簡單實現(xiàn)

          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91丁香五月 | 亚洲九九九九九九 | 亚洲无码在线视频播放 | 来操逼网| 成人做爱网站视频|