激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - PHP訪問MySQL查詢超時處理的方法

PHP訪問MySQL查詢超時處理的方法

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

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手冊沒有發現這個操作選項或者函數。 

 

手冊里只有這么四個選項

PHP訪問MySQL查詢超時處理的方法

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

php-5.2.8/ext/mysqli/mysqli_api.c

PHP訪問MySQL查詢超時處理的方法

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

php-5.2.8/ext/mysqli/mysqli.c

PHP訪問MySQL查詢超時處理的方法

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

mysql-5.1.30/sql-common/client.c

PHP訪問MySQL查詢超時處理的方法

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

mysql-5.1.30/include/mysql.h

PHP訪問MySQL查詢超時處理的方法

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

mysql-5.1.30/sql-common/client.c

PHP訪問MySQL查詢超時處理的方法

PHP訪問MySQL查詢超時處理的方法

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

 

mysql-5.1.30/sql/net_serv.cc

PHP訪問MySQL查詢超時處理的方法

 

 

 

PHP訪問MySQL查詢超時處理的方法

 

 

 

現在基本得出了結論:

 

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

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

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

 

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

 

那么就是說最少超時時間是3秒,不會低于這個值,對于大部分應用來說可以接受,但是對于小部分應用需要優化。
現在我們來看看如果我們自己要設置超時,我們自己壓入 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"; 
?> 

 

 

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

 

PHP訪問MySQL查詢超時處理的方法

 

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

 

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

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

 

 

MySQL相關的vio代碼:

 

poll 超時:

PHP訪問MySQL查詢超時處理的方法

 

setsockopt 超時:

 

PHP訪問MySQL查詢超時處理的方法

 

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年人高清视频在线观看 | 中文字幕在线观看成人 | 毛片韩国 | 日韩色视频在线观看 | 超碰一区 | 91社影院在线观看 | 九九热九九 | 一级免费视频 | 亚洲一区国产视频 | 99精品国产在热久久婷婷 | 国产1区在线 | a黄色片 | 美国人成人在线视频 | av在线播放地址 | 精品国产一区二区三区四区阿崩 | 在线成人影视 | 欧美18xxxx| 日韩欧美精品电影 | 综合国产在线 | 性片网站| 线观看免费完整aaa 欧美在线一级 | 美乳在线观看 | 精品在线观看一区二区 | 久久新地址 | 伊人在线视频 | 国产一级毛片高清视频 | 92看片淫黄大片欧美看国产片 | 亚洲天堂成人在线 | 美国一级黄色毛片 | 久久草在线观看视频 | 爱福利视频网 | 国产亚洲精品成人a | 黄色免费在线网址 | 主播粉嫩国产在线精品 | 免费国产视频大全入口 | 九九热精品视频在线 | 国内精品久久久久久久影视红豆 | 午夜视频在线 | 日日鲁夜夜视频热线播放 | 国产精品手机在线亚洲 | 男女污视频在线观看 |