当前位置:首页 > Mysql教程 > 列表

mysql设置查询超时方法

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-13 14:48:51 浏览: 评论:0 

文章来介绍了自定义mysql查询超时的时间长度,下面我们来看看详细的设置方法,首先, 在libmysql中,是提供了MYSQL_OPT_READ_TIMEOUT设置项的,并且libmysql中提供了设置相关设置项的API,代码如下:

  1. mysql_options: 
  2.  
  3. int STDCALL 
  4.  
  5. mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg) 
  6.  
  7. { 
  8.  
  9.   DBUG_ENTER("mysql_option"); 
  10.  
  11.   DBUG_PRINT("enter",("option: %d",(int) option)); 
  12.  
  13.   switch (option) { 
  14.  
  15.   case MYSQL_OPT_CONNECT_TIMEOUT: 
  16.  
  17.     mysql->options.connect_timeout= *(uint*) arg; 
  18.  
  19.     break; 
  20.  
  21.   /** 读超时时间 */ 
  22.  
  23.   case MYSQL_OPT_READ_TIMEOUT: 
  24.  
  25.     mysql->options.read_timeout= *(uint*) arg; 
  26.  
  27.     break; 
  28.  
  29.   case MYSQL_OPT_WRITE_TIMEOUT: 
  30.  
  31.     mysql->options.write_timeout= *(uint*) arg; 
  32.  
  33.     break; 
  34.  
  35.   case MYSQL_OPT_COMPRESS: 
  36.  
  37.     mysql->options.compress= 1; 

但是,可惜的是,目前只有mysqli扩展,把mysql_options完全暴露给了PHP,代码如下:

  1. PHP_FUNCTION(mysqli_options) 
  2.  
  3. { 
  4.  
  5.  /** 有省略 */ 
  6.  
  7.      switch (Z_TYPE_PP(mysql_value)) { 
  8.  
  9.         /** 没有任何限制, 直接传递给mysql_options */ 
  10.  
  11.         case IS_STRING: 
  12.  
  13.             ret = mysql_options(mysql->mysql, mysql_option, Z_STRVAL_PP(mysql_value)); 
  14.  
  15.             break; 
  16.  
  17.         default: 
  18.  
  19.             convert_to_long_ex(mysql_value); 
  20.  
  21.             l_value = Z_LVAL_PP(mysql_value); 
  22.  
  23.             ret = mysql_options(mysql->mysql, mysql_option, (char *)&l_value);  //phpfensi.com 
  24.  
  25.             break; 
  26.  
  27.     } 
  28.  
  29.     RETURN_BOOL(!ret); 
  30.  
  31. } 

但是因为Mysqli并没有导出这个常量,所以我们需要通过查看MySQL的代码,得到MYSQL_OPT_READ_TIMEOUT的实际值,然后直接调用mysql_options,代码如下:

  1. enum mysql_option 
  2.  
  3. { 
  4.  
  5.   MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, 
  6.  
  7.   MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, 
  8.  
  9.   MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, 
  10.  
  11.   MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, 
  12.  
  13.   MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, 
  14.  
  15.   MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, 
  16.  
  17.   MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, 
  18.  
  19.   MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, 
  20.  
  21.   MYSQL_OPT_SSL_VERIFY_SERVER_CERT 
  22.  
  23. }; 

可以看到,MYSQL_OPT_READ_TIMEOUT为11,现在,我们就可以设置查询超时了,代码如下:

  1. $mysqli = mysqli_init(); 
  2.  
  3. $mysqli->options(11 /*MYSQL_OPT_READ_TIMEOUT*/, 1); 
  4.  
  5. $mysql->real_connect(***); 

不过, 因为在libmysql中有重试机制(尝试一次, 重试俩次),所以,最终我们设置的超时阈值都会三倍于我们设置的值.

也就是说,如果我们设置了MYSQL_OPT_READ_TIMEOUT为1,最终会在3s以后超时结束,也就是说,我们目前能设置的最短超时时, 就是3秒…

虽说大了点,不过总比没有好, 呵呵

Tags: mysql设置查询 mysql查询超时

分享到: