Maison  >  Article  >  développement back-end  >  Comment définir le délai d'attente pour la requête MySQL pour lire les données en php

Comment définir le délai d'attente pour la requête MySQL pour lire les données en php

coldplay.xixi
coldplay.xixioriginal
2020-07-27 16:28:183925parcourir

Comment définir le délai d'attente pour la requête mysql pour lire les données en PHP : 1. Utilisez mysqlnd pour définir le délai d'attente pour la requête mysql. Le code est [mysqlnd.net_read_timeout =3] ; délai d'attente pour la lecture.

Comment définir le délai d'attente pour la requête MySQL pour lire les données en php

Comment définir le délai d'attente pour la requête MySQL pour lire les données en php :

Le premier paramètre La méthode pour le délai d'expiration des requêtes MySQL consiste à utiliser mysqlnd.

Une fois que php a activé l'extension mysqlnd, définissez simplement mysqlnd.net_read_timeout dans le fichier php.ini.

L'unité de valeur du paramètre est la seconde. Par exemple :

mysqlnd.net_read_timeout = 3

signifie que le délai d'attente pour chaque requête mysql est de 3 secondes. Si le délai expire, une erreur sera signalée.

Par exemple, le code suivant :

<?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";
?>

signalera une erreur :

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

En raison d'une erreur PHP Fatal, le code après fetch() ne sera pas exécuté.

Par conséquent, le code doit juger la valeur de retour de la requête. Le code modifié est le suivant :

<?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";
?>

Remarque : le niveau de l'élément de réglage mysqlnd.net_read_timeout est PHP_INI_SYSTEM. Par conséquent, le timeout de la requête mysql ne peut pas être modifié dans le code php.

Une autre façon consiste à utiliser mysqli.

Si mysqlnd n'est pas activé en PHP, vous pouvez utiliser mysqli pour limiter le délai de lecture.

L'exemple de code est le suivant :

<?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";
?>

Remarque :

1. L'unité de réglage du délai d'attente est en secondes et la configuration minimale est de 1 seconde

2. Mais la lecture sous-jacente de mysql Il sera réessayé deux fois, donc le temps réel sera de 3 secondes

Deux tentatives + lui-même une fois = 3 fois le délai d'attente.

Cela signifie que le délai d'attente minimum est de 3 secondes, ce qui ne sera pas inférieur à cette valeur. Il est acceptable pour la plupart des applications, mais il doit être optimisé pour un petit nombre d'applications.

Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn