做守护进程时,必须开启长时间的mysql连接,通常使用长连接方式,但是长连接会导致连接池膨胀,而且长连接也是有可能断掉的。
所以应该在查询时加上错误信息判断,判断到连接断开的话,必须马上重连并再次查询,才能保证守护进程的持续运行。
像通常使用的mysql扩展(现在用mysqli替代了)中,使用mysql_error函数就可以获得上一次请求的错误文字信息
而很多童鞋使用的是pdomysql扩展,在pdo中又怎样获取错误信息呢。通过以下两种方式:
1、PDOStatement::errorInfo
如果查询用预处理语句方式,可以引用预处理对象的errorInfo方法
PDOStatement::errorInfo()返回一个关于上一次语句句柄执行操作的错误信息的数组 。该数组包含下列字段:
Element | Information |
0 | SQLSTATE 错误码(一个由5个字母或数字组成的在 ANSI SQL 标准中定义的标识符)。 |
1 | 具体驱动错误码。 |
2 | 具体驱动错误信息。 |
结果类似:
Array(
[0] => 42S02
[1] => -204
[2] => [IBM][CLI Driver][DB2/LINUX] SQL0204N "DANIELS.BONES" is an undefined name. SQLSTATE=42704
)
如果是连接断掉的错误,array[2]的字串会是“MySQL server has gone away”或者“Lost connection to MySQL server”
2、PDO::getAttribute(PDO::ATTR_SERVER_INFO)
应用pdo连接对象的getAttribute方法并定义参数为PDO::ATTR_SERVER_INFO
该方法和参数返回的是数据库连接的服务器信息属性值
结果类似:
Uptime: 9696057 Threads: 20 Questions: 348373738 Slow queries: 2149 Opens: 81755 Flush tables: 1 Open tables: 1193 Queries per second avg: 35.929
如果是连接断掉的错误,结果会是类似“MySQL server has gone away”或者“Lost connection to MySQL server”的字串,或者是false
总结
根据你的代码,选择上面两种的其中之一,判断到连接断掉的话,就重连数据库
判断的时机是,:
1、预处理对象引用execute 执行操作,返回是false时
2、连接对象引用query 执行操作,返回是false时