php中設(shè)置mysql查詢讀取數(shù)據(jù)的超時時間方法:1、使用mysqlnd設(shè)置mysql查詢超時時間,代碼為【mysqlnd.net_read_timeout =3】;2、使用mysqli進行限制read的超時時間。
php中設(shè)置mysql查詢讀取數(shù)據(jù)的超時時間方法:
第一種設(shè)置mysql查詢超時時間的方法是使用mysqlnd。
php啟用mysqlnd擴展后,只要在php.ini文件中設(shè)置mysqlnd.net_read_timeout即可。
參數(shù)值的單位為秒。如:
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 awayphp warning: pdo::query(): error reading result set's headerphp fatal error: call to a member function fetch() on a non-object由于出現(xiàn)了php fatal error錯誤,導(dǎo)致fetch()之后的代碼將無法執(zhí)行。
因此代碼需要對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è)置項 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);}//設(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秒不超時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秒會超時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è)置單位為秒,最少配置1秒
2. 但mysql底層的read會重試兩次,所以實際會是 3 秒
重試兩次 自身一次 = 3倍超時時間。
那么就是說最少超時時間是3秒,不會低于這個值,對于大部分應(yīng)用來說可以接受,但是對于小部分應(yīng)用需要優(yōu)化。
相關(guān)學(xué)習(xí)推薦:php編程從入門到精通