最近,閒來無事在網上查詢資料資訊時見到有針對於mysql查詢可以進行非同步化,十分感興趣,於是特別的搜了一下,facebook最早是使用hack才得以實現但是現在的php5.5,已經無需hack就可以實現了。
簡單的說一下對於web**的效能來說,瓶頸多半是來自於資料庫。一般資料庫查詢會在某個請求的整體耗時中佔很大比例。在有甚者可能造成服務請求超時。以往長做的操作是對於資料庫的一系列優化,其實都是為了提高資料庫的查詢效率,這樣**整體響應的時間會有很大的提公升。但如果在這些之上能實現mysql查詢的非同步化,就可以實現多條sql語句同時執行。這樣就可以更加大大縮短mysql查詢的耗時。畢竟並行永遠會比序列的效率高,而且當查詢語句的執行時間越長 這個並行的效果也就是越明顯。
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資料庫負載不高的情況下,使用非同步查詢還是不錯的選擇。
乙個很不錯的遠端軟體TeamViewer
teamviewer teamviewer是乙個能在任何防火牆和nat 的後台用於遠端控制,桌面共享 和檔案傳輸的簡單且快速的解決方案。為了連線到另一台計算機,只需要在兩台計算機上同時執行 teamviewer 即可,而不需要進行安裝 也可以選擇安裝,安裝後可以設定開機執行 該軟體第一次啟動在兩台計...
很不錯的文章
身邊經常可見奇形怪狀的男子。打扮時髦,出手大方,善於與女子曖昧,周轉靈活,腦筋清楚,身上卻不見任何承擔的重量。有些尚且自戀到一定程度,全身上下的名牌,告訴你他的鞋子購自普拉達,衣服來自polo。也能暢談一下哲學或者人生道理,時不時亮出無從考證的身份,炫耀左右逢源,家底豐厚的能力。男人無趣到只能以吹噓...
很不錯的心裡測試
場景 你在森林的深處,你向前走,看見前面有一座很舊的小屋。1 這個小屋的門現在是什麼狀態?開著 關著 2 你走進屋子裡看見一張桌子這個桌子是什麼形狀的?圓形 橢圓形 正方形 長方形 三角形 3 在桌子上有個花瓶,瓶子裡有水,有多少水在花瓶裡?滿的 一半 空的 4 這個瓶子是由什麼材料製造的?玻璃 陶...