php中mysql資料庫非同步查詢實現

2022-05-17 21:30:44 字數 4221 閱讀 5936

問題

通常乙個web應用的效能瓶頸在資料庫。因為,通常情況下php中mysql查詢是序列的。也就是說,如果指定兩條sql語句時,第二條sql語句會等到第一條sql語句執行完畢再去執行。這個時候,如果執行2條sql語句,每條執行時間為50ms,全部執行完畢可能需要100ms。既然,主要原因是sql的序列執行導致。那我們是不是可以改變執行方式來提高效能呢?答案是,可以的。我們可以通過非同步執行的方式來提高效能。

非同步如果通過非同步的方式去執行,可能性能會有很大提公升。如果是採用非同步的方式,兩條sql語句會併發執行,可能就需要60ms就可以執行完畢。

實現mysqli + mysqlnd。php官方實現的mysqlnd中提供了非同步查詢的方法。分別是:

mysqlnd_async_query 傳送查詢請求

mysqlnd_reap_async_query 獲取查詢結果

這樣就可以不必每次傳送完查詢請求後,一直阻塞等待查詢結果了。

實現**如下:12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

4950

5152

5354

5556

5758

5960

6162

6364

6566

6768

6970

7172

7374

7576

77<?php

$host='127.0.0.1';

$user='root';

$password='';

$database='test';

/**

* 期望得到額結果

* array(

*  1 => int,

*  2 => int,

*  3 => int

* )

*/

$result=array(1=>0, 2=>0, 3=>0);

//非同步方式[併發請求]

$time_start= microtime(true);

$links=array();

foreach($resultas$key=>$value)

$done= 0;

$total=count($links);

foreach($linksas$value) ", mysqli_async);

}

do

$read=$errors=$reject=$tmp;

$re= mysqli_poll($read,$errors,$reject, 1);

if(false ===$re)elseif($re< 1)

foreach($readas$link)else

$done++;

}

foreach($errorsas$link)

foreach($rejectas$link)

}while($done<$total);

var_dump($result);

echo"async_query_time:", microtime(true)-$time_start,"\n";

$link=end($links);

$link=$link['link'];

echo"\n";

結語mysql資料庫對於每個查詢請求都是單獨啟動乙個執行緒進行處理。如果mysql伺服器啟動執行緒過多,必然會造成執行緒切換引起系統負載過高。如果在mysql資料庫負載不高的情況下,使用非同步查詢還是不錯的選擇。

參考文件

php中mysql資料庫非同步查詢實現

問題 通常乙個web應用的效能瓶頸在資料庫。因為,通常情況下php中mysql查詢是序列的。也就是說,如果指定兩條sql語句時,第二條sql語句會等到第一條sql語句執行完畢再去執行。這個時候,如果執行2條sql語句,每條執行時間為50ms,全部執行完畢可能需要100ms。既然,主要原因是sql的序...

php 使用mysql資料庫增刪改查

為了方便直接,寫成函式了。驚訝於php的簡潔,幾分鐘就搞定了。解釋一下 header content type text html charset utf 8 這句可以防止亂碼 conn mysql connect localhost root root if conn 或者寫成 conn mysq...

php操作mysql資料庫(增刪改查)

1 連線到mysql php本身提供腿mysql資料庫的支援,使用mysql connect函式來連線,語法如下 resource mysql connect string server string username string password bool new link int client...