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

2021-09-23 21:52:04 字數 1593 閱讀 5529

問題

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

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

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

mysqlnd_async_query 傳送查詢請求

mysqlnd_reap_async_query 獲取查詢結果

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

實現**如下:

<?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 ($result as $key=>$value)

$done = 0;

$total = count($links);

foreach ($links as $value) ", mysqli_async);}

do

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

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

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

foreach ($read as $link) else

$done++;

}foreach ($errors as $link)

foreach ($reject as $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...