日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > 數(shù)據(jù)庫 > MySql > PHP訪問MySQL數(shù)據(jù)庫,設定查詢超時處理時間

PHP訪問MySQL數(shù)據(jù)庫,設定查詢超時處理時間

來源:程序員人生   發(fā)布時間:2013-12-10 04:10:42 閱讀次數(shù):6661次

PHP連接MySQL主要是使用Mysql提供的 libmysqlclient 的客戶端庫,同時也延伸出來 mysql 和  mysqli 兩套PHP的擴展,相對來說 mysqli 比 mysql 更好,更穩(wěn)定。

目前兩個客戶端擴展庫連接超時可以設置選項來操作,比如mysqli:

<?php
//創(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: %s/n", mysqli_connect_error());
    exit();
}
//成功輸出連接信息
printf ("Connection: %s/n.", $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:

php-5.2.8/ext/mysqli/mysqli_api.c

并且在mysqli的PHP擴展中就只導出了幾個變量:

php-5.2.8/ext/mysqli/mysqli.c

大概看了一下 libmysqlclient 的代碼,發(fā)現(xiàn)其實它自帶是有讀寫超時設置的:

mysql-5.1.30/sql-common/client.c

因為它自己定義了很多操作選項,只是php擴展里沒有:

mysql-5.1.30/include/mysql.h

看看mysql中的讀寫超時是如何實現(xiàn)的:

mysql-5.1.30/sql-common/client.c

讀寫超時真正操作的地方,超時處理這里重試了兩次,還是寫死了:

mysql-5.1.30/sql/net_serv.cc

現(xiàn)在基本得出了結論:

現(xiàn)在我們來看看如果我們自己要設置超時,我們自己壓入 MYSQL_OPT_READ_TIMEOUT 也是可以達到讀寫超時效果的,寫一段代碼來測試一下:

<?php
//自己定義讀寫超時常量
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: %s/n", mysqli_connect_error());
   exit();
}

//執(zhí)行查詢 sleep 1秒不超時
printf("Host information: %s/n", $mysqli->host_info);
if (!($res=$mysqli->query('select sleep(1)'))) {
    echo "query1 error: ". $mysqli->error ."/n";
} else {
    echo "Query1: query success/n";
}

//執(zhí)行查詢 sleep 9秒會超時
if (!($res=$mysqli->query('select sleep(9)'))) {
    echo "query2 error: ". $mysqli->error ."/n";
} else {
    echo "Query2: query success/n";
}

$mysqli->close();
echo "close mysql connection/n";
?>

查看上面代碼的執(zhí)行結果,驗證了上面的觀點,第一個查詢成功了,第二個查詢連接被斷開了:

如果需要修改這個秒級別的超時,比如改成毫秒級別的超時,只能兩個地方修改:

1.  修改客戶端,比如 mysqli 的 query 代碼,加入定時器,超時則返回

2.  修改 Mysql 中的vio代碼,因為mysql的網(wǎng)絡處理底層都是經(jīng)過vio的操作

MySQL相關的vio代碼:

poll 超時:

setsockopt 超時:

基本上到這里就基本能夠解決PHP在針對MySQL讀寫查詢操作超時的處理了,希望對你有幫助。

按照上面查看代碼來看,目前PHP針對MySQL查詢超時以下限制:

1. 超時設置單位為秒,最少配置1秒

2. 但mysql底層的read會重試兩次,所以實際會是 3 秒

重試兩次 + 自身一次 = 3倍超時時間。

那么就是說最少超時時間是3秒,不會低于這個值,對于大部分應用來說可以接受,但是對于小部分應用需要優(yōu)化。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 中文字幕精品久久久久 | 蜜臀91丨九色丨蝌蚪中文 | 免费av在线播放 | 成人一区视频 | 国产午夜精品在线观看 | 高清不卡一区二区 | 亚洲一区二区免费电影 | 欧美精品高清 | 色噜噜偷拍精品综合在线 | 免费黄色网页 | 国产一区二区三区久久久久久久久 | 国产精品久久久久久久久久三级 | 怡红院在线观看 | 成年人免费在线视频 | 欧美精品三区 | 日韩色综合 | 欧美第一区 | 日本黄xxxxxxxxx100 | 日日干天天射 | 国产亚洲精品久久久久久牛牛 | 这里是精品 | 欧洲xxx| 一区二区三区久久 | 日韩一区二区视频 | 亚洲高清在线观看 | 成人综合网站 | 欧美日韩免费观看视频 | 日本久久91 | 久久噜噜噜精品国产亚洲综合 | 成人不卡 | av成人在线观看 | 亚洲成人中文字幕 | 日韩在线欧美 | 精品视频久久 | 黄色免费在线视频 | 久久久蜜桃 | 日韩 欧美 中文 | 国产午夜精品一区二区三区四区 | 国产一二三视频 | 日本亚洲欧美 | 黑人中文字幕一区二区三区 |