多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > MySql > PHP訪問MySQL數據庫,設定查詢超時處理時間

PHP訪問MySQL數據庫,設定查詢超時處理時間

來源:程序員人生   發布時間:2013-12-10 04:10:42 閱讀次數:6646次

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

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

<?php
//創建對象
$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();
?>

這個是連接超時,但是有些時候我們需要查詢讀寫超時,比如說我們一個數據庫壓力很大,或者連接很多,那么數據庫查詢就很緩慢,但是我希望某些不重要的數據,比如說文章點擊數這種如果查詢超時了就不顯示,至少能夠保證主體頁面正確顯示,但是查遍PHP手冊沒有發現這個操作選項或者函數。

手冊里只有這么四個選項

跟蹤 mysqli 的擴展源代碼發現它底層調用的是 libmysqlclient 的 mysql_options:

php-5.2.8/ext/mysqli/mysqli_api.c

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

php-5.2.8/ext/mysqli/mysqli.c

大概看了一下 libmysqlclient 的代碼,發現其實它自帶是有讀寫超時設置的:

mysql-5.1.30/sql-common/client.c

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

mysql-5.1.30/include/mysql.h

看看mysql中的讀寫超時是如何實現的:

mysql-5.1.30/sql-common/client.c

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

mysql-5.1.30/sql/net_serv.cc

現在基本得出了結論:

現在我們來看看如果我們自己要設置超時,我們自己壓入 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);

//連接數據庫
$mysqli->real_connect("localhost", "root", "root", "test");
if (mysqli_connect_errno()) {
   printf("Connect failed: %s/n", mysqli_connect_error());
   exit();
}

//執行查詢 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";
}

//執行查詢 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";
?>

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

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

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

2.  修改 Mysql 中的vio代碼,因為mysql的網絡處理底層都是經過vio的操作

MySQL相關的vio代碼:

poll 超時:

setsockopt 超時:

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

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

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

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

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

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美videofree性欧美另类 | 午夜老司机免费视频 | 波多野一区二区三区在线 | 免费的禁片| 91嫩草国产在线观看免费 | 亚洲伦理网站 | 永久免费在线播放 | 中文字幕一区二区三区免费看 | 久久午夜影院 | 日本一区二区三区免费看 | 欧美 xx性 在线 | 狂野欧美激情性xxxx | 性欧美xxxxhd | 波多野结衣免费在线视频 | 免费视频在线观看网站 | 男人边吃奶边摸下面好爽视频 | 99干99| 日本做人爱免费视频 | 国产精品久久久久久搜索 | yellow影院在线观看免费 | 黄网站色网址 | 最近中文国语字幕在线播放视频 | 最近中文字幕国语完整视频 | 最近免费中文字幕mv视频 | 手机在线完整视频免费观看 | 日韩欧美一区二区三区在线观看 | 久久欧美久久欧美精品 | 精品国产免费一区二区三区五区 | 一级做a爰片性色毛片2021 | 欧美毛片 | 欧美视频一区二区三区在线观看 | 亚洲区欧美中文字幕久久 | 国产91一区二区在线播放不卡 | 日本japanese18日本护士xxxx | 国产美女精品自拍 | 最近免费中文字幕大全高清10 | 欧美一级aa毛片禁片 | 久久国产精品老女人 | 国产综合久久久久 | 国产日韩高清一区二区三区 | 樱花aⅴ一区二区三区四区 影视精品网站入口 |