您的位置:首页 > 编程语言 > PHP开发

关于php pdo连接mysql,查询超时问题

2016-09-23 16:19 791 查看
很少写博客,格式不好,见谅。

首先问题是这样发现的,

我在php项目使用到了 workerman,这是一个 常驻内存的cli模式下的socket开发包。(非常给力!)

然后有时候task进程或无故卡死,并不报错,然后就是整个服务瘫痪。

最后发现是通过PDO链接MYSQL进行查询的时候,不知道怎么的,反正就是不报错,又阻塞了!(反正是数据库的锅,因为太不稳定了)

于是就想实现query timeout。

之后查阅了很多文档,自己也做过很多测试。

PDO有个参数ATTR_TIMEOUT:

PDO::ATTR_TIMEOUT: Specifies the timeout duration in seconds. Not
all drivers support this option, and its meaning may differ from driver to driver. For example, sqlite will
wait for up to this time value before giving up on obtaining an writable lock, but other drivers may interpret this as a connect or a read timeout interval.

尝试了该参数,发现在win和linux上都无效。大家可以再试试 给我反馈哈。

之后就是mysqlnd扩展参数了,我这边是装的有,于是就改了php.ini的配置:

mysqlnd.net_read_timeout = 5

这个确实能生效,而且也测试了 只是querysql的时间,不包含db连接的时间,如果超时异常会从execute抛出。

但是这个事全局生效的,我的业务要求高实时,但是其他的业务可能允许几十秒的sql。

因此这个配置不能用。

最终mysql我建议还是改到mysqli

那里面有

mysql底层的read会重试两次,一共三次。

此处引用自 http://blog.csdn.net/heiyeshuwu/article/details/5869813

参数不生效是php5.3之后 已经没用libmysql了。

--------------------------------------

上面的mysqli 今天在公司没测试完,但是好像不行。mysqli只有一个连接超时参数,并没有查询超时。

最好的办法还是 通过curl超时去调用。curl的超时返回false 比较好判断。

----------再后续2016-9-24------------------

不甘心通过curl调用的方式,因此找到了解决办法。

mysql有async模式,可以在query的时候计时并自主断开连接。

我昨天写了个类库,准备看看如果没有类似的话,丢到git上给大家用。

----------相应的实现---------------------

http://blog.csdn.net/wwaayyaaa/article/details/52671792
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息