《Mysql必讀PHP訪問(wèn)MySQL查詢超時(shí)處理的方法》要點(diǎn):
本文介紹了Mysql必讀PHP訪問(wèn)MySQL查詢超時(shí)處理的方法,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
?MYSQL教程
手冊(cè)里只有這么四個(gè)選項(xiàng)MYSQL教程
MYSQL教程
跟蹤 mysqli 的擴(kuò)展源代碼發(fā)現(xiàn)它底層調(diào)用的是 libmysqlclient 的 mysql_options:MYSQL教程
php-5.2.8/ext/mysqli/mysqli_api.cMYSQL教程
MYSQL教程
并且在mysqli的PHP擴(kuò)展中就只導(dǎo)出了幾個(gè)變量:MYSQL教程
php-5.2.8/ext/mysqli/mysqli.cMYSQL教程
MYSQL教程
大概看了一下 libmysqlclient 的代碼,發(fā)現(xiàn)其實(shí)它自帶是有讀寫超時(shí)設(shè)置的:MYSQL教程
mysql-5.1.30/sql-common/client.cMYSQL教程
MYSQL教程
因?yàn)樗约憾x了很多操作選項(xiàng),只是php擴(kuò)展里沒(méi)有:MYSQL教程
mysql-5.1.30/include/mysql.hMYSQL教程
MYSQL教程
看看mysql中的讀寫超時(shí)是如何實(shí)現(xiàn)的:MYSQL教程
mysql-5.1.30/sql-common/client.cMYSQL教程
MYSQL教程
MYSQL教程
讀寫超時(shí)真正操作的地方,超時(shí)處理這里重試了兩次,還是寫死了:MYSQL教程
mysql-5.1.30/sql/net_serv.ccMYSQL教程
MYSQL教程
MYSQL教程
現(xiàn)在基本得出了結(jié)論:MYSQL教程
按照上面查看代碼來(lái)看,目前PHP針對(duì)MySQL查詢超時(shí)以下限制:MYSQL教程 1. 超時(shí)設(shè)置單位為秒,最少配置1秒MYSQL教程 2. 但mysql底層的read會(huì)重試兩次,所以實(shí)際會(huì)是 3 秒MYSQL教程 ?MYSQL教程 重試兩次 + 自身一次 = 3倍超時(shí)時(shí)間.MYSQL教程 ?MYSQL教程 那么就是說(shuō)最少超時(shí)時(shí)間是3秒,不會(huì)低于這個(gè)值,對(duì)于大部分應(yīng)用來(lái)說(shuō)可以接受,但是對(duì)于小部分應(yīng)用需要優(yōu)化. 查看上面代碼的執(zhí)行結(jié)果,驗(yàn)證了上面的觀點(diǎn),第一個(gè)查詢成功了,第二個(gè)查詢連接被斷開了:MYSQL教程 如果需要修改這個(gè)秒級(jí)別的超時(shí),比如改成毫秒級(jí)別的超時(shí),只能兩個(gè)地方修改:MYSQL教程 ?MYSQL教程 1.? 修改客戶端,比如 mysqli 的 query 代碼,加入定時(shí)器,超時(shí)則返回MYSQL教程 2.? 修改 Mysql 中的vio代碼,因?yàn)?/span>mysql的網(wǎng)絡(luò)處理底層都是經(jīng)過(guò)vio的操作MYSQL教程 MySQL相關(guān)的vio代碼:MYSQL教程 poll 超時(shí):MYSQL教程 setsockopt 超時(shí):MYSQL教程 基本上到這里就基本能夠解決PHP在針對(duì)MySQL讀寫查詢操作超時(shí)的處理了,希望對(duì)你有幫助.
現(xiàn)在我們來(lái)看看如果我們自己要設(shè)置超時(shí),我們自己壓入 MYSQL_OPT_READ_TIMEOUT 也是可以達(dá)到讀寫超時(shí)效果的,寫一段代碼來(lái)測(cè)試一下:
<?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ù)庫(kù)
$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";
?>
MYSQL教程MYSQL教程
MYSQL教程
MYSQL教程
heiyeluren的blogMYSQL教程
歡迎參與《Mysql必讀PHP訪問(wèn)MySQL查詢超時(shí)處理的方法》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13103.html