Heim >Backend-Entwicklung >PHP-Problem >So legen Sie das Timeout für die MySQL-Abfrage zum Lesen von Daten in PHP fest
So legen Sie das Timeout für die MySQL-Abfrage zum Lesen von Daten in PHP fest: 1. Verwenden Sie mysqlnd, um das Timeout für die MySQL-Abfrage festzulegen. Der Code lautet [mysqlnd.net_read_timeout =3] 2. Verwenden Sie mysqli, um die zu begrenzen Zeitüberschreitung beim Lesen.
So legen Sie die Timeout-Zeit für die MySQL-Abfrage zum Lesen von Daten in PHP fest:
Das erste Einstellung Die Methode für das MySQL-Abfrage-Timeout ist die Verwendung von mysqlnd.
Nachdem PHP die Mysqlnd-Erweiterung aktiviert hat, legen Sie einfach mysqlnd.net_read_timeout
in der Datei php.ini fest.
Die Einheit des Parameterwerts ist Sekunden. Beispiel:
mysqlnd.net_read_timeout = 3
bedeutet, dass das Timeout für jede MySQL-Abfrage 3 Sekunden beträgt. Bei einer Zeitüberschreitung wird ein Fehler gemeldet.
Beispielsweise meldet der folgende Code:
<?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"; ?>
einen Fehler:
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
Aufgrund eines schwerwiegenden PHP-Fehlers wird der Code nach fetch() nicht ausgeführt.
Daher muss der Code den Rückgabewert der Abfrage beurteilen. Der geänderte Code lautet wie folgt:
<?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"; ?>
Hinweis: Die Ebene des Einstellungselements mysqlnd.net_read_timeout
ist PHP_INI_SYSTEM
. Daher kann das Timeout der MySQL-Abfrage nicht im PHP-Code geändert werden.
Eine andere Möglichkeit ist die Verwendung von MySQL.
Wenn mysqlnd in PHP nicht aktiviert ist, können Sie mysqli verwenden, um das Lese-Timeout zu begrenzen.
Der Beispielcode lautet wie folgt:
<?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"; ?>
Hinweis:
1. Die Timeout-Einstellungseinheit ist Sekunden und die Mindestkonfiguration beträgt 1 Sekunde
2. Aber das zugrunde liegende Lesen von MySQL Es wird zweimal wiederholt, sodass die tatsächliche Zeit 3 Sekunden beträgt
Zwei Wiederholungsversuche + sich selbst einmal = 3-fache Zeitüberschreitung.
Das bedeutet, dass die Mindestzeitüberschreitung 3 Sekunden beträgt, was für die meisten Anwendungen akzeptabel ist, für eine kleine Anzahl von Anwendungen jedoch optimiert werden muss.
Verwandte Lernempfehlungen: PHP-Programmierung vom Einstieg bis zur Beherrschung
Das obige ist der detaillierte Inhalt vonSo legen Sie das Timeout für die MySQL-Abfrage zum Lesen von Daten in PHP fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!