为MySQL设置查询超时
浏览:1377次 出处信息
昨天有人在群里问, MySQL是否可以设置读写超时(非连接超时), 如果可以就可以避免一条SQL执行过慢, 导致PHP超时错误. 这个, 其实可以有. 只不过稍微要麻烦点.
首先, 在libmysql中, 是提供了MYSQL_OPT_READ_TIMEOUT设置项的, 并且libmysql中提供了设置相关设置项的API, mysql_options:
int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg) { DBUG_ENTER("mysql_option"); DBUG_PRINT("enter",("option: %d",(int) option)); switch (option) { case MYSQL_OPT_CONNECT_TIMEOUT: mysql->options.connect_timeout= *(uint*) arg; break; /** 读超时时间 */ case MYSQL_OPT_READ_TIMEOUT: mysql->options.read_timeout= *(uint*) arg; break; case MYSQL_OPT_WRITE_TIMEOUT: mysql->options.write_timeout= *(uint*) arg; break; case MYSQL_OPT_COMPRESS: mysql->options.compress= 1; /* 以下省略 */
但是, 可惜的是, 目前只有mysqli扩展, 把mysql_options完全暴露给了PHP:
PHP_FUNCTION(mysqli_options) { /** 有省略 */ switch (Z_TYPE_PP(mysql_value)) { /** 没有任何限制, 直接传递给mysql_options */ case IS_STRING: ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(mysql_value)); break; default: convert_to_long_ex(mysql_value); l_value = Z_LVAL_PP(mysql_value); ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value); break; } RETURN_BOOL(!ret); }
但是因为Mysqli并没有导出这个常量, 所以我们需要通过查看MySQL的代码, 得到MYSQL_OPT_READ_TIMEOUT的实际值, 然后直接调用mysql_options:
enum mysql_option { MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, MYSQL_OPT_SSL_VERIFY_SERVER_CERT };
可以看到, MYSQL_OPT_READ_TIMEOUT为11.
现在, 我们就可以设置查询超时了:
options(11 /*MYSQL_OPT_READ_TIMEOUT*/, 1); $mysql->real_connect(***);
不过, 因为在libmysql中有重试机制(尝试一次, 重试俩次), 所以, 最终我们设置的超时阈值都会三倍于我们设置的值.
也就是说, 如果我们设置了MYSQL_OPT_READ_TIMEOUT为1, 最终会在3s以后超时结束. 也就是说, 我们目前能设置的最短超时时, 就是3秒…
虽说大了点,, 不过总比没有好, 呵呵
PS: 写了一半的时候, 就发现小黑已经写过一篇了, 还比我的详细(不过我真舍不得写了一半的东西)… 所以大家也可以参看这篇PHP访问MySQL查询超时处理
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
文章信息
- 作者:雪候鸟 来源: 风雪之隅
- 标签: 查询超时
- 发布时间:2011-04-27 23:58:38
近3天十大热文
- [71] Twitter/微博客的学习摘要
- [65] IOS安全–浅谈关于IOS加固的几种方法
- [65] find命令的一点注意事项
- [63] android 开发入门
- [62] Go Reflect 性能
- [62] 如何拿下简短的域名
- [61] Oracle MTS模式下 进程地址与会话信
- [60] 流程管理与用户研究
- [57] 【社会化设计】自我(self)部分――欢迎区
- [57] 图书馆的世界纪录