Php 为什么PDO在我们告诉它不要这样做时会产生警告?
问题 我们告诉PDO将每个问题包装成异常。 在某些情况下,它会生成一些警告,然后抛出异常 为什么它会这样做 重复项? 关于这件事,没有正确的答案。最后一个问题是,但人们只是将其标记为重复,而不是仔细回答Php 为什么PDO在我们告诉它不要这样做时会产生警告?,php,pdo,mysqlnd,Php,Pdo,Mysqlnd,问题 我们告诉PDO将每个问题包装成异常。 在某些情况下,它会生成一些警告,然后抛出异常 为什么它会这样做 重复项? 关于这件事,没有正确的答案。最后一个问题是,但人们只是将其标记为重复,而不是仔细回答 被接受的答案不是答案,它为什么这么做,什么时候做。因此,我进行了研究并将回答。这是因为PDO可以使用mysqlnd驱动程序,它不尊重PDO的任何“将问题转换为扩展”策略 你看 我们清楚地看到有直接调用php\u error\u docref 下面几行解释了一个示例:使用set\u error\u
被接受的答案不是答案,它为什么这么做,什么时候做。因此,我进行了研究并将回答。这是因为PDO可以使用mysqlnd驱动程序,它不尊重PDO的任何“将问题转换为扩展”策略 你看 我们清楚地看到有直接调用
php\u error\u docref
下面几行解释了一个示例:使用set\u error\u handler()和restore\u error\u handler()
公共函数查询($sql)
{
$retries=0;
$result=null;
while(true){
试一试{
设置错误处理程序(函数(){
});
$result=$this->pdo->query($sql);
还原错误处理程序();
打破
}捕获(例外$e){
还原错误处理程序();
如果(++$retriesgetMessage(),'server has away')!==false){
$this->connect();
$this->getLogger()->info('重新连接数据库,原因:服务器已离开');
}
}否则{
扔$e;
}
}
}
返回$result;
}
这是显而易见的。问题是“为什么”会发生。不是怎么治的。无论如何,它会帮助那些不知道它的人。
public function query($sql)
{
$retries = 0;
$result = null;
while (true) {
try {
set_error_handler(function () {
});
$result = $this->pdo->query($sql);
restore_error_handler();
break;
} catch (Exception $e) {
restore_error_handler();
if (++$retries < self::RECONNECT_ATTEMPT) {
if (strpos($e->getMessage(), 'server has gone away') !== false) {
$this->connect();
$this->getLogger()->info('Reconnect database, reason: server has gone away');
}
} else {
throw $e;
}
}
}
return $result;
}