ホームページ  >  記事  >  バックエンド開発  >  PHPでデータを読み取るためにmysqlクエリのタイムアウトを設定する方法

PHPでデータを読み取るためにmysqlクエリのタイムアウトを設定する方法

coldplay.xixi
coldplay.xixiオリジナル
2020-07-27 16:28:184029ブラウズ

php でデータを読み取るための mysql クエリのタイムアウト時間を設定する方法: 1. mysqlnd を使用して mysql クエリのタイムアウト時間を設定します、コードは [mysqlnd.net_read_timeout =3]; 2. mysqli を使用して読み取りのタイムアウト時間を制限します。

PHPでデータを読み取るためにmysqlクエリのタイムアウトを設定する方法

php でデータを読み取るための mysql クエリのタイムアウト時間を設定する方法:

最初のmysqlクエリタイムアウトの設定方法はmysqlndを使用することです。

php で mysqlnd 拡張機能を有効にした後、php.ini ファイルで mysqlnd.net_read_timeout を設定するだけです。

パラメータ値の単位は秒です。例:

mysqlnd.net_read_timeout = 3

は、各 mysql クエリのタイムアウトが 3 秒であることを意味します。タイムアウトになると、エラーが報告されます。

たとえば、次のコードが使用される場合:

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

、エラーが報告されます:

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

PHP 致命的エラーにより、fetch() の後のコード実行されません。

したがって、クエリの戻り値を判定する必要があるため、修正コードは以下のとおりです:

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

注: 設定項目 mysqlnd.net_read_timeout のレベル PHP_INI_SYSTEM です。したがって、mysql クエリのタイムアウトを PHP コードで変更することはできません。

もう 1 つの方法は、mysqli を使用することです。

PHP で mysqlnd が有効になっていない場合は、mysqli を使用して読み取りタイムアウトを制限できます。

サンプル コードは次のとおりです:

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

注:

1. タイムアウト設定の単位は秒で、最小構成は 1 秒です

2. ただし、基礎となる mysql の読み取りは 2 回再試行されるため、実際の時間は 3 秒になります。

再試行自体が 2 回 = タイムアウトの 3 倍になります。

つまり、最小タイムアウトは 3 秒であり、この値より低くなることはありません。ほとんどのアプリケーションでは許容されますが、少数のアプリケーションに対しては最適化する必要があります。

関連する学習の推奨事項: PHP プログラミングの入門から熟練度まで

以上がPHPでデータを読み取るためにmysqlクエリのタイムアウトを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。