>  기사  >  백엔드 개발  >  PHP에서 데이터를 읽기 위해 mysql 쿼리의 시간 초과를 설정하는 방법

PHP에서 데이터를 읽기 위해 mysql 쿼리의 시간 초과를 설정하는 방법

coldplay.xixi
coldplay.xixi원래의
2020-07-27 16:28:183925검색

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即可。

参数值的单位为秒。如:

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 Fatal error错误,导致fetch()之后的代码将无法执行。

因此代码需要对query的返回值做下判断,修改后的代码如下:

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

파라미터 값의 단위는 초입니다. 예:

<?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";
?>
는 각 mysql 쿼리의 시간 초과가 3초임을 의미합니다. 시간이 초과되면 오류가 보고됩니다.

예를 들어, 다음 코드:

rrreee

는 오류를 보고합니다.

rrreee

PHP 치명적인 오류로 인해 fetch() 이후의 코드는 실행되지 않습니다.

그래서 코드는 쿼리의 반환값을 판단해야 합니다. 수정된 코드는 다음과 같습니다.

rrreee

참고: mysqlnd.net_read_timeout 설정 항목의 레벨은 PHP_INI_SYSTEM입니다. >. 따라서 mysql 쿼리의 시간 초과는 PHP 코드에서 수정할 수 없습니다.

또 다른 방법은 mysqli를 사용하는 것입니다.

PHP에서 mysqlnd가 활성화되지 않은 경우 mysqli를 사용하여 읽기 시간 초과를 제한할 수 있습니다.

샘플 코드는 다음과 같습니다. rrreee참고:

1. 시간 초과 설정 단위는 초이며, 최소 구성은 1초입니다.🎜🎜2. 그러나 mysql의 기본 읽기는 두 번 다시 시도하므로 실제 시간은 3초입니다🎜🎜재시도 2회 + 단독 1회 = 타임아웃 3배. 🎜🎜즉, 최소 시간 제한은 3초이며 이 값보다 낮을 수는 없습니다. 이는 대부분의 애플리케이션에 허용되지만 소수의 애플리케이션에 대해서는 최적화가 필요합니다. 🎜🎜🎜관련 학습 권장 사항: 🎜초보부터 마스터까지 PHP 프로그래밍🎜🎜🎜

위 내용은 PHP에서 데이터를 읽기 위해 mysql 쿼리의 시간 초과를 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.