溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何設置php中mysql查詢讀取數據的超時時間

發布時間:2020-07-30 17:04:11 來源:億速云 閱讀:264 作者:Leah 欄目:編程語言

如何設置php中mysql查詢讀取數據的超時時間?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

php中設置mysql查詢讀取數據的超時時間方法:1、使用mysqlnd設置mysql查詢超時時間,代碼為【mysqlnd.net_read_timeout =3】;2、使用mysqli進行限制read的超時時間。

php中設置mysql查詢讀取數據的超時時間方法:

第一種設置mysql查詢超時時間的方法是使用mysqlnd。

php啟用mysqlnd擴展后,只要在php.ini文件中設置mysqlnd.net_read_timeout即可。

參數值的單位為秒。如:

mysqlnd.net_read_timeout = 3

表示每次mysql查詢超時時間為3秒。如果超時,則會報錯。

如下面的代碼:

<?php
$dsn = 'mysql:dbname=demo;host=127.0.0.1;port=3306';
$user = 'demo';
$password = 'demo';
$dbh = new PDO($dsn, $user, $password);
$dbh->query("set names utf8");
$sql = "select sleep(5)";
$sth = $dbh->query($sql);
$row = $sth->fetch();
echo "over";
?>

則會報錯誤:

PHP Warning: PDO::query(): MySQL server has gone away
PHP Warning: PDO::query(): Error reading result set's header
PHP Fatal error: Call to a member function fetch() on a non-object

由于出現了PHP Fatal error錯誤,導致fetch()之后的代碼將無法執行。

因此代碼需要對query的返回值做下判斷,修改后的代碼如下:

<?php
$dsn = 'mysql:dbname=demo;host=127.0.0.1;port=3306';
$user = 'demo';
$password = 'demo';
$dbh = new PDO($dsn, $user, $password);
$dbh->query("set names utf8");
$sql = "select sleep(5)";
$sth = $dbh->query($sql);
if(is_object($sth)){
    $row = $sth->fetch();
}
echo "over";
?>

注意:設置項 mysqlnd.net_read_timeout 的級別是PHP_INI_SYSTEM。所以在php代碼中不能修改mysql查詢的超時時間。

另一種方式是使用mysqli。

如果php沒有啟用mysqlnd,那么可以使用mysqli進行限制read的超時時間。

示例代碼如下:

<?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. 超時設置單位為秒,最少配置1秒

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

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

那么就是說最少超時時間是3秒,不會低于這個值,對于大部分應用來說可以接受,但是對于小部分應用需要優化。


關于如何設置php中mysql查詢讀取數據的超時時間問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女