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程式設計從入門到精通
以上是php中如何設定mysql查詢讀取資料的逾時時間的詳細內容。更多資訊請關注PHP中文網其他相關文章!