原創 PHP訪問MySQL查詢超時處理

2022-08-04 10:36:11 字數 2606 閱讀 4082

分類: linux/freebsd/server

mysql

phpquery

擴充套件資料庫

優化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 ("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'))

if (!defined('mysql_opt_write_timeout'))

//設定超時

$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())

//執行查詢 sleep 1秒不超時

printf("host information: %s/n", $mysqli->host_info);

if (!($res=$mysqli->query('select sleep(1)'))) else

//執行查詢 sleep 9秒會超時

if (!($res=$mysqli->query('select sleep(9)'))) else

$mysqli->close();

echo "close mysql connection/n";

?>

檢視上面**的執行結果,驗證了上面的觀點,第乙個查詢成功了,第二個查詢連線被斷開了:

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

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

2.  修改 mysql 中的vio**,因為mysql的網路處理底層都是經過vio的操作

poll 超時:

setsockopt 超時:

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

php資料訪問 查詢

輸入關鍵字效果 type 代表sql語句的型別,0代表增刪改,1代表查詢 5 db new dbda 67 如果沒有提交資料,顯示所有 8 如果有提交資料,根據關鍵字查詢顯示 9 name 10 tj1 1 1 第乙個條件,對應名稱,注意空格 11 tj2 1 1 第二個條件,對應系列,注意空格 1...

php 訪問超時,PHP SOAP 客戶端訪問超時

今天在windows機器上做php soap的測試。服務端環境 windows 客戶端環境 windows 服務端和客戶端都在乙個環境 windows 上。遇到的問題 服務端能正常的啟動,客戶端訪問服務端的時候,一直顯示超時 504錯誤。我的開發環境是nginx php,準備作乙個soap的實驗,s...

php訪問mysql 封裝

php訪問mysql資料庫封裝類 mysql 資料庫訪問封裝類 mysql 資料訪問方式,php4支援以mysql 開頭的過程訪問方式,php5開始支援以mysqli 開頭的過程和mysqli物件導向 訪問方式,本封裝類以mysql 封裝 資料訪問的一般流程 1,連線資料庫 mysql connec...