php でデータを読み取るための mysql クエリのタイムアウト時間を設定する方法: 1. mysqlnd を使用して mysql クエリのタイムアウト時間を設定します、コードは [mysqlnd.net_read_timeout =3]; 2. mysqli を使用して読み取りのタイムアウト時間を制限します。
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 致命的エラーにより、fetch() の後のコード実行されません。
したがって、クエリの戻り値を判定する必要があるため、修正コードは以下のとおりです:
<?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
です。したがって、mysql クエリのタイムアウトを PHP コードで変更することはできません。
もう 1 つの方法は、mysqli を使用することです。
PHP で mysqlnd が有効になっていない場合は、mysqli を使用して読み取りタイムアウトを制限できます。
サンプル コードは次のとおりです:
<?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 の読み取りは 2 回再試行されるため、実際の時間は 3 秒になります。
再試行自体が 2 回 = タイムアウトの 3 倍になります。
つまり、最小タイムアウトは 3 秒であり、この値より低くなることはありません。ほとんどのアプリケーションでは許容されますが、少数のアプリケーションに対しては最適化する必要があります。
関連する学習の推奨事項: PHP プログラミングの入門から熟練度まで
以上がPHPでデータを読み取るためにmysqlクエリのタイムアウトを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。