作者: Laruence 昨天有人在群里问, MySQL是否可以设置读写超时(非连接超时), 如果可以就可以避免一条SQL执行过慢, 导致PHP超时错误. 这个, 其实可以有. 只不过稍微要麻烦点. 首先, 在libmysql中, 是提供了MYSQL_OPT_READ_TIMEOUT设置项的, 并且libmysql中提供了设置相关设置项的API, mysql_options:
1 | int STDCALL |
但是, 可惜的是, 目前只有mysqli扩展, 把mysql_options完全暴露给了PHP:
1 | PHP_FUNCTION(mysqli_options) |
但是因为Mysqli并没有导出这个常量, 所以我们需要通过查看MySQL的代码, 得到MYSQL_OPT_READ_TIMEOUT的实际值, 然后直接调用mysql_options:
1 | enum mysql_option |
可以看到, MYSQL_OPT_READ_TIMEOUT为11. 现在, 我们就可以设置查询超时了:
1 | <?php |
不过, 因为在libmysql中有重试机制(尝试一次, 重试俩次), 所以, 最终我们设置的超时阈值都会三倍于我们设置的值. 也就是说, 如果我们设置了MYSQL_OPT_READ_TIMEOUT为1, 最终会在3s以后超时结束. 也就是说, 我们目前能设置的最短超时时, 就是3秒… 虽说大了点,, 不过总比没有好, 呵呵 PS: 写了一半的时候, 就发现小黑已经写过一篇了, 所以大家也可以参看这篇PHP访问MySQL查询超时处理
本文链接: https://erik.xyz/2014/12/22/wei-mysql-she-zhi-cha-xun-chao-shi/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!