PHP連接MySQL主要是使用Mysql提供的 libmysqlclient 的客戶端庫,同時也延伸出來 mysql 和 mysqli 兩套PHP的擴展,相對來說 mysqli 比 mysql 更好,更穩(wěn)定。
目前兩個客戶端擴展庫連接超時可以設置選項來操作,比如mysqli:
代碼如下:
//創(chuàng)建對象
$mysqli = mysqli_init();
//設置超時選項
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
//連接
$mysqli->real_connect(‘localhost’, ‘my_user’, ‘my_password’, ‘world’);
//如果超時或者其他連接失敗打印錯誤信息
if (mysqli_connect_errno()) {
printf(“Connect failed: %sn”, mysqli_connect_error());
exit();
}
//成功輸出連接信息
printf (“Connection: %sn.”, $mysqli->host_info);
$mysqli->close();
?>
這個是連接超時,但是有些時候我們需要查詢讀寫超時,比如說我們一個數(shù)據(jù)庫壓力很大,或者連接很多,那么數(shù)據(jù)庫查詢就很緩慢,但是我希望某些不重要的數(shù)據(jù),比如說文章點擊數(shù)這種如果查詢超時了就不顯示,至少能夠保證主體頁面正確顯示,但是查遍PHP手冊沒有發(fā)現(xiàn)這個操作選項或者函數(shù)。
手冊里只有這么四個選項
跟蹤 mysqli 的擴展源代碼發(fā)現(xiàn)它底層調(diào)用的是 libmysqlclient 的 mysql_options:
并且在mysqli的PHP擴展中就只導出了幾個變量:
大概看了一下 libmysqlclient 的代碼,發(fā)現(xiàn)其實它自帶是有讀寫超時設置的:
因為它自己定義了很多操作選項,只是php擴展里沒有:
看看mysql中的讀寫超時是如何實現(xiàn)的:
代碼如下:
//自己定義讀寫超時常量
if (!defined(‘MYSQL_OPT_READ_TIMEOUT’)) {
define(‘MYSQL_OPT_READ_TIMEOUT’, 11);
}
if (!defined(‘MYSQL_OPT_WRITE_TIMEOUT’)) {
define(‘MYSQL_OPT_WRITE_TIMEOUT’, 12);
}
//設置超時
$mysqli = mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT, 3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT, 1);
//連接數(shù)據(jù)庫
$mysqli->real_connect(“localhost”, “root”, “root”, “test”);
if (mysqli_connect_errno()) {
printf(“Connect failed: %sn”, mysqli_connect_error());
exit();
}
//執(zhí)行查詢 sleep 1秒不超時
printf(“Host information: %sn”, $mysqli->host_info);
if (!($res=$mysqli->query(‘select sleep(1)’))) {
echo “query1 error: “. $mysqli->error .”n”;
} else {
echo “Query1: query successn”;
}
//執(zhí)行查詢 sleep 9秒會超時
if (!($res=$mysqli->query(‘select sleep(9)’))) {
echo “query2 error: “. $mysqli->error .”n”;
} else {
echo “Query2: query successn”;
}
$mysqli->close();
echo “close mysql connectionn”;
?>
基本上到這里就基本能夠解決PHP在針對MySQL讀寫查詢操作超時的處理了,希望對你有幫助。
heiyeluren的blog