我正在运行一个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)
有人可以帮我吗?
答案 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将等到这个时间值 放弃获得可写锁,但其他驱动程序可能 将此解释为连接或读取超时间隔。