日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php异步查询数据库,php中mysql数据库异步查询实现

發(fā)布時間:2023/12/2 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php异步查询数据库,php中mysql数据库异步查询实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題

通常一個web應(yīng)用的性能瓶頸在數(shù)據(jù)庫。因為,通常情況下php中mysql查詢是串行的。也就是說,如果指定兩條sql語句時,第二條sql語句會等到第一條sql語句執(zhí)行完畢再去執(zhí)行。這個時候,如果執(zhí)行2條sql語句,每條執(zhí)行時間為50ms,全部執(zhí)行完畢可能需要100ms。既然,主要原因是sql的串行執(zhí)行導(dǎo)致。那我們是不是可以改變執(zhí)行方式來提高性能呢?答案是,可以的。我們可以通過異步執(zhí)行的方式來提高性能。

異步

如果通過異步的方式去執(zhí)行,可能性能會有很大提升。如果是采用異步的方式,兩條sql語句會并發(fā)執(zhí)行,可能就需要60ms就可以執(zhí)行完畢。

實現(xiàn)

mysqli + mysqlnd。php官方實現(xiàn)的mysqlnd中提供了異步查詢的方法。分別是:

mysqlnd_async_query 發(fā)送查詢請求

mysqlnd_reap_async_query 獲取查詢結(jié)果

這樣就可以不必每次發(fā)送完查詢請求后,一直阻塞等待查詢結(jié)果了。

實現(xiàn)代碼如下: int,

* 2 => int,

* 3 => int

* )

*/

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

//異步方式[并發(fā)請求]

$time_start = microtime(true);

$links = array();

foreach ($result as $key=>$value) {

$obj = new mysqli($host, $user, $password, $database);

$links[spl_object_hash($obj)] = array('value'=>$key, 'link'=>$obj);

}

$done = 0;

$total = count($links);

foreach ($links as $value) {

$value['link']->query("SELECT COUNT(*) AS `total` FROM `demo` WHERE `value`={$value['value']}", MYSQLI_ASYNC);

}

do {

$tmp = array();

foreach ($links as $value) {

$tmp[] = $value['link'];

}

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

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

if (false === $re) {

die('mysqli_poll failed');

} elseif ($re < 1) {

continue;

}

foreach ($read as $link) {

$sql_result = $link->reap_async_query();

if (is_object($sql_result)) {

$sql_result_array = $sql_result->fetch_array(MYSQLI_ASSOC);//只有一行

$sql_result->free();

$hash = spl_object_hash($link);

$key_in_result = $links[$hash]['value'];

$result[$key_in_result] = $sql_result_array['total'];

} else {

echo $link->error, "\n";

}

$done++;

}

foreach ($errors as $link) {

echo $link->error, "1\n";

$done++;

}

foreach ($reject as $link) {

printf("server is busy, client was rejected.\n", $link->connect_error, $link->error);

//這個地方別再$done++了。

}

} while ($done

var_dump($result);

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

$link = end($links);

$link = $link['link'];

echo "\n";

結(jié)語

mysql數(shù)據(jù)庫對于每個查詢請求都是單獨啟動一個線程進(jìn)行處理。如果mysql服務(wù)器啟動線程過多,必然會造成線程切換引起系統(tǒng)負(fù)載過高。如果在mysql數(shù)據(jù)庫負(fù)載不高的情況下,使用異步查詢還是不錯的選擇。

本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請注明出處,感謝您的尊重!

總結(jié)

以上是生活随笔為你收集整理的php异步查询数据库,php中mysql数据库异步查询实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。