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

服務(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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 边摸边吃奶边做爽视频免费 | 激情小说欧美图片 | 羞羞视频动漫 | 亚洲第一福利视频 | 国产免费资源高清小视频在线观看 | 亚洲国产综合久久久无码色伦 | 思久久| 亚洲国产精品久久久久久 | 亚洲精品国产成人99久久 | 免费视频片在线观看 | 啊啊啊好大好爽视频 | 男人最爱看的网站 | 暖暖在线日本 | 五月天精品在线 | 欧美一级片观看 | 麻麻与子乱肉小说怀孕 | av中文字幕网免费观看 | 无码专区aaaaaa免费视频 | 韩国日本在线观看 | tube62hdxxxx日本 | 日本道色综合久久影院 | 香蕉免费一区二区三区 | 2021麻豆剧果冻传媒入口永久 | 青草视频网址 | 欧美另类bbbxxxxx另类 | www.国产一区二区三区 | 成人一区二区免费中文字幕 | 久久久这里有精品999 | 884aa草莓视频 | 亚洲国产成人综合 | 法国女佣系列在线播放 | 欧美日韩看看2015永久免费 | 四虎www| 啊哈用力cao我 | 国产精品福利短视在线播放频 | 俄罗斯bbbbbbxxxxxx | 国产精品视频视频久久 | 兽皇日本| 操美女网址 | 五月天婷婷网亚洲综合在线 | 男人v天堂 |