php中如何設(shè)置mysql查詢讀取數(shù)據(jù)的超時時間

發(fā)布時間:2024-01-26
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編程從入門到精通
上一個:曼松貢茶的歷史傳說
下一個:RC0805JR-07180RL,0805 180Ω 5% 1/8W 電阻

ZTEQ802D怎么刷機圖片,ETONT800怎么刷機
貝殼花花期是什么時候
房屋買賣委托公證有效嗎
2020電腦主機主流配置清單,電腦的主流配置
RC0805DR-0737K4L,0805 37.4KΩ 0.5% 1/8W 電阻
四方竹的分布習(xí)性及觀賞應(yīng)用
快速感應(yīng)門誠信經(jīng)營廠家
RTT25275JTE現(xiàn)貨庫存,最新價格
破壞交通設(shè)施罪既遂怎么定罪處罰?
城市輕軌施工難點剖析及對策
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos