您好,登錄后才能下訂單哦!
如何設(shè)置php中mysql查詢讀取數(shù)據(jù)的超時(shí)時(shí)間?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
php中設(shè)置mysql查詢讀取數(shù)據(jù)的超時(shí)時(shí)間方法:1、使用mysqlnd設(shè)置mysql查詢超時(shí)時(shí)間,代碼為【mysqlnd.net_read_timeout =3】;2、使用mysqli進(jìn)行限制read的超時(shí)時(shí)間。
php中設(shè)置mysql查詢讀取數(shù)據(jù)的超時(shí)時(shí)間方法:
第一種設(shè)置mysql查詢超時(shí)時(shí)間的方法是使用mysqlnd。
php啟用mysqlnd擴(kuò)展后,只要在php.ini文件中設(shè)置mysqlnd.net_read_timeout
即可。
參數(shù)值的單位為秒。如:
mysqlnd.net_read_timeout = 3
表示每次mysql查詢超時(shí)時(shí)間為3秒。如果超時(shí),則會(huì)報(bào)錯(cuò)。
如下面的代碼:
<?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"; ?>
則會(huì)報(bào)錯(cuò)誤:
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
由于出現(xiàn)了PHP Fatal error錯(cuò)誤,導(dǎo)致fetch()之后的代碼將無法執(zhí)行。
因此代碼需要對(duì)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"; ?>
注意:設(shè)置項(xiàng) mysqlnd.net_read_timeout
的級(jí)別是PHP_INI_SYSTEM
。所以在php代碼中不能修改mysql查詢的超時(shí)時(shí)間。
另一種方式是使用mysqli。
如果php沒有啟用mysqlnd,那么可以使用mysqli進(jìn)行限制read的超時(shí)時(shí)間。
示例代碼如下:
<?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ù)庫 $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"; ?>
注意:
1. 超時(shí)設(shè)置單位為秒,最少配置1秒
2. 但mysql底層的read會(huì)重試兩次,所以實(shí)際會(huì)是 3 秒
重試兩次 + 自身一次 = 3倍超時(shí)時(shí)間。
那么就是說最少超時(shí)時(shí)間是3秒,不會(huì)低于這個(gè)值,對(duì)于大部分應(yīng)用來說可以接受,但是對(duì)于小部分應(yīng)用需要優(yōu)化。
關(guān)于如何設(shè)置php中mysql查詢讀取數(shù)據(jù)的超時(shí)時(shí)間問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。