一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - PHP訪問MySQL查詢超時(shí)處理的方法

PHP訪問MySQL查詢超時(shí)處理的方法

2019-11-18 15:11heiyeluren的blog Mysql

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

目前兩個(gè)客戶端擴(kuò)展庫連接超時(shí)可以設(shè)置選項(xiàng)來操作,比如mysqli: 

復(fù)制代碼代碼如下:


<?php 
//創(chuàng)建對象 
$mysqli = mysqli_init(); 
//設(shè)置超時(shí)選項(xiàng) 
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); 
//連接 
$mysqli->real_connect('localhost', 'my_user', 'my_password', 'world'); 
//如果超時(shí)或者其他連接失敗打印錯(cuò)誤信息 
if (mysqli_connect_errno()) { 
printf("Connect failed: %s\n", mysqli_connect_error()); 
exit(); 

//成功輸出連接信息 
printf ("Connection: %s\n.", $mysqli->host_info); 
$mysqli->close(); 
?> 


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

 

手冊里只有這么四個(gè)選項(xiàng)

PHP訪問MySQL查詢超時(shí)處理的方法

跟蹤 mysqli 的擴(kuò)展源代碼發(fā)現(xiàn)它底層調(diào)用的是 libmysqlclient 的 mysql_options:

php-5.2.8/ext/mysqli/mysqli_api.c

PHP訪問MySQL查詢超時(shí)處理的方法

并且在mysqli的PHP擴(kuò)展中就只導(dǎo)出了幾個(gè)變量:

php-5.2.8/ext/mysqli/mysqli.c

PHP訪問MySQL查詢超時(shí)處理的方法

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

mysql-5.1.30/sql-common/client.c

PHP訪問MySQL查詢超時(shí)處理的方法

因?yàn)樗约憾x了很多操作選項(xiàng),只是php擴(kuò)展里沒有:

mysql-5.1.30/include/mysql.h

PHP訪問MySQL查詢超時(shí)處理的方法

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

mysql-5.1.30/sql-common/client.c

PHP訪問MySQL查詢超時(shí)處理的方法

PHP訪問MySQL查詢超時(shí)處理的方法

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

 

mysql-5.1.30/sql/net_serv.cc

PHP訪問MySQL查詢超時(shí)處理的方法

 

 

 

PHP訪問MySQL查詢超時(shí)處理的方法

 

 

 

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

 

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

1. 超時(shí)設(shè)置單位為秒,最少配置1秒

2. 但mysql底層的read會(huì)重試兩次,所以實(shí)際會(huì)是 3 秒

 

重試兩次 + 自身一次 = 3倍超時(shí)時(shí)間。

 

那么就是說最少超時(shí)時(shí)間是3秒,不會(huì)低于這個(gè)值,對于大部分應(yīng)用來說可以接受,但是對于小部分應(yīng)用需要優(yōu)化。
現(xiàn)在我們來看看如果我們自己要設(shè)置超時(shí),我們自己壓入 MYSQL_OPT_READ_TIMEOUT 也是可以達(dá)到讀寫超時(shí)效果的,寫一段代碼來測試一下: 

復(fù)制代碼代碼如下:


<?php 
//自己定義讀寫超時(shí)常量 
if (!defined('MYSQL_OPT_READ_TIMEOUT')) { 
define('MYSQL_OPT_READ_TIMEOUT', 11); 

if (!defined('MYSQL_OPT_WRITE_TIMEOUT')) { 
define('MYSQL_OPT_WRITE_TIMEOUT', 12); 


//設(shè)置超時(shí) 
$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秒不超時(shí) 
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秒會(huì)超時(shí) 
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í)行結(jié)果,驗(yàn)證了上面的觀點(diǎn),第一個(gè)查詢成功了,第二個(gè)查詢連接被斷開了:

 

PHP訪問MySQL查詢超時(shí)處理的方法

 

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

 

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

2.  修改 Mysql 中的vio代碼,因?yàn)閙ysql的網(wǎng)絡(luò)處理底層都是經(jīng)過vio的操作

 

 

MySQL相關(guān)的vio代碼:

 

poll 超時(shí):

PHP訪問MySQL查詢超時(shí)處理的方法

 

setsockopt 超時(shí):

 

PHP訪問MySQL查詢超時(shí)處理的方法

 

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 毛片网站大全 | 美女扒开两腿露出尿口的视频 | 电车痴汉(han) | 含羞草传媒网站免费进入欢迎 | 午夜国产 | 无套日出白浆在线播放 | 青青久久精品国产免费看 | 欧美精品日韩一区二区三区 | 亚洲成熟人网站 | 免费观看韩剧网站在线观看 | 欧美3p大片在线观看完整版 | 九九九国产在线 | 欧美精品一区视频 | 久久中文字幕无线观看 | 忘忧草在线社区WWW日本-韩国 | 青青草原国产视频 | 久久国产36精品色熟妇 | 成年人在线观看视频免费 | 97se亚洲国产综合自在线观看 | 99热免费在线观看 | 久久精品国产在热亚洲 | 亚洲国产精品一区二区久久 | 性肥胖BWBWBW| 国产123区在线视频观看 | 欧美va在线| 欧美一区二区三区四区在线观看 | 色噜噜狠狠色综合 | gogort99人体专业网站 | 边摸边吃奶边做爽gif动态图 | 妹妹骑上来蹭着蹭着就射了 | 国产日韩视频一区 | 出水小说 | 欧美一区二区三区四区视频 | 亚洲人成网站在线观看青青 | 亚洲小视频在线 | 调教催眠改造np总攻 | 欧美精品国产一区二区 | 青苹果乐园影院免费观看完整版 | 欧洲美女人牲交一级毛片 | 色婷婷久久综合中文久久一本` | 欧美日韩一区二区三区在线视频 |