PHP拜訪MySQL查詢超時處置的辦法。本站提示廣大學習愛好者:(PHP拜訪MySQL查詢超時處置的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是PHP拜訪MySQL查詢超時處置的辦法正文
手冊裡只要這麼四個選項
跟蹤 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
如今根本得出了卻論:
依照下面檢查代碼來看,今朝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";
?>
檢查下面代碼的履行成果,驗證了下面的不雅點,第一個查詢勝利了,第二個查詢銜接被斷開了:
假如須要修正這個秒級其余超時,好比改成毫秒級其余超時,只能兩個處所修正:
1. 修正客戶端,好比 mysqli 的 query 代碼,參加准時器,超時則前往
2. 修正 Mysql 中的vio代碼,由於mysql的收集處置底層都是經由vio的操作
MySQL相干的vio代碼:
poll 超時:
setsockopt 超時:
根本上到這裡就根本可以或許處理PHP在針對MySQL讀寫查詢操作超時的處置了,願望對你有贊助。
heiyeluren的blog