PHP非同步併發訪問mysql簡單實現

2021-07-05 00:14:05 字數 4544 閱讀 2583

php非同步併發訪問mysql簡單實現

在實際的開發過程中,我們常常會遇到需要操作多張表,多個庫的情況。有時因為一些限制我們不能進行連表(例如,異地資料庫),所以只能用php序列訪問後再在php裡進行合併,有時還需要模擬mysql對合併後的結果進行排序、歸併等。

這裡產生的乙個問題就是序列帶來的訪問時間問題。由於傳統的序列訪問方式,我們只能等到一條sql執行完畢後才可以執行下一條,所以執行時間是累加的。php官方手冊提供了一種可以非同步併發訪問mysql的方式,詳見:參考資料:使用此種方式,我們可以對mysql進行非同步併發訪問,訪問時間不再是序列累加,而是取決於執行時間最長的sql。

show you the code:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

trycatch(exception$e)

async_mysql物件對mysql進行非同步併發訪問,attach方法接收每個請求必須的配置資訊,execute方法為執行入口,其返回值是每條sql執行結果的陣列,順序與attach呼叫順序一致。

當任何乙個連線mysql出錯或執行任何一條sql出錯,都會引起異常丟擲。這樣設計主要是基於完整性的考慮,我們把所有需要執行的sql看做是乙個整體事務,任何乙個執行失敗,則認為該事務失敗。

composer資訊:

1

2

3

"require":

或者直接引入/path/to/async-mysql-php/autoload.php檔案

最後在阿里雲上做了乙個簡單的測試,測試結果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

# 同步

[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。

由於同一時間要處理多個sql返回的結果,程式需要連續申請多個記憶體空間用於儲存sql的返回結果。

所以使用這種方式會造成記憶體翻倍。從下面的測試結果來看,記憶體基本位置在兩倍以內(測試程式執行了兩條sql)。

到了這一步,我們已經可以實現對mysql進行非同步併發訪問了。如果我們還需要做多個陣列的歸併,可以使用《php模擬sql的group by演算法》中介紹的方法。其中提供的歸併方式非常靈活,更勝mysql原生的group by。

如果還需要對合併後的結果做排序,可以使用這段**實現,非常方便。改函式**於php手冊

php繪製當前訪問併發,php如何實現併發

php實現併發的方法 首先寫好針對第三方的請求介面 然後使用併發請求這些第三方的介面,併發 如 function request 最後使用php實現迴圈請求介面即可。php實現併發 使用場景 如果你第三方的多個介面,需要迴圈請求,這時候就需要併發處理,因為 php 是單程序,順序執行的程式,如果有乙...

php訪問mysql 封裝

php訪問mysql資料庫封裝類 mysql 資料庫訪問封裝類 mysql 資料訪問方式,php4支援以mysql 開頭的過程訪問方式,php5開始支援以mysqli 開頭的過程和mysqli物件導向 訪問方式,本封裝類以mysql 封裝 資料訪問的一般流程 1,連線資料庫 mysql connec...

php訪問mysql 封裝

mysql 資料庫訪問封裝類 mysql 資料訪問方式,php4支援以mysql 開頭的過程訪問方式,php5開始支援以mysqli 開頭的過程和mysqli物件導向 訪問方式,本封裝類以mysql 封裝 資料訪問的一般流程 1,連線資料庫 mysql connect or mysql pconne...