IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

为MySQL设置查询超时

风雪之隅 2011-04-27 23:58:38 累计浏览 1,869 次
本机暂存

     首先, 在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查询超时处理

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,253)
  2. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  3. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,401)
  4. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  5. Mysql监控指南 (累计阅读 21,352)
  6. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  7. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,523)
  8. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  9. 在Apache2.2.XX下安装Mod-myvhost模块 (累计阅读 13,058)
  10. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)