PHP致命错误:未被捕获的HY000:“ Adaptive Server连接超时”

时间:2018-11-11 04:15:46

标签: php sql-server pdo

我正在运行一个PHP脚本以连接到MsSQL并执行长时间运行的存储过程。该过程需要一个我通过此脚本传递的ID。我遍历所有ID数组并调用此过程。但是,对于某些ID,此过程将花费大量时间并超时。我将ATTR_TIMEOUT PDO属性设置为600s。我在try catch块中包含了所有PDO语句。尽管如此,我还是遇到了这个未捕获的异常。这是我的示例代码:(请忽略new_statement参数。我在此处使用了虚拟变量。它是有效的,可以正常运行)

try {
$statement = PDO::new_statement('DB', $sql, 0, false, false, [PDO::ATTR_TIMEOUT => 600]);
$this->execute($statement);
} catch (Exception $e) {
$logger->error("Error for ID: " . $id);
}

这对于大多数ID都非常适用。某些长时间运行的ID失败。如果执行查询存在超时问题,我希望记录该错误。但是我看到此异常:

PHP致命错误:未捕获的HY000  [“ HY000”,20003,“ Adaptive Server连接超时[20003](严重性6)

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

将选项传递给PDO构造函数:

$pdo = new PDO(
    "mysql:host=$host;dbname=$dbname", 
    $username, 
    $password,
    array(
        PDO::ATTR_TIMEOUT => "(seconds)",
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);

如果这样做没有帮助,您可以尝试在php.ini中手动设置connect_timeout或使用ini_set()

mysql.connect_timeout = "(seconds)"

如果驱动程序使用套接字进行基本连接并设置超时,则需要使用套接字(流)超时功能

ini_set(“ default_socket_timeout”,“(seconds)”);

您还应该知道

  

PDO :: ATTR_TIMEOUT:指定超时时间(以秒为单位)。不是全部   驱动程序支持此选项,其含义可能因驱动程序而异   司机。例如,sqlite将等到这个时间值   放弃获得可写锁,但其他驱动程序可能   将此解释为连接或读取超时间隔。