Heim  >  Artikel  >  Backend-Entwicklung  >  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

coldplay.xixi
coldplay.xixiOriginal
2020-07-27 16:28:184028Durchsuche

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 das Timeout für die MySQL-Abfrage zum Lesen von Daten in PHP fest

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 = &#39;mysql:dbname=demo;host=127.0.0.1;port=3306&#39;;
$user = &#39;demo&#39;;
$password = &#39;demo&#39;;
$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&#39;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 = &#39;mysql:dbname=demo;host=127.0.0.1;port=3306&#39;;
$user = &#39;demo&#39;;
$password = &#39;demo&#39;;
$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(&#39;MYSQL_OPT_READ_TIMEOUT&#39;)) {
        define(&#39;MYSQL_OPT_READ_TIMEOUT&#39;,  11);
}
if (!defined(&#39;MYSQL_OPT_WRITE_TIMEOUT&#39;)) {
        define(&#39;MYSQL_OPT_WRITE_TIMEOUT&#39;, 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(&#39;select sleep(1)&#39;))) {
    echo "query1 error: ". $mysqli->error ."/n";
} else {
    echo "Query1: query success/n";
}
//执行查询 sleep 9秒会超时
if (!($res=$mysqli->query(&#39;select sleep(9)&#39;))) {
    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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn