程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> PHP拜訪MySQL查詢超時處置的辦法

PHP拜訪MySQL查詢超時處置的辦法

編輯:MySQL綜合教程

PHP拜訪MySQL查詢超時處置的辦法。本站提示廣大學習愛好者:(PHP拜訪MySQL查詢超時處置的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是PHP拜訪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手冊沒有發明這個操作選項或許函數。

 

手冊裡只要這麼四個選項

跟蹤 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved