mysql設定查詢逾時方法

來源:互聯網
上載者:User

首先, 在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.

現在, 我們就可以設定查詢逾時了:

<?php

 代碼如下 複製代碼

$mysqli = mysqli_init();

$mysqli->options(11 /*MYSQL_OPT_READ_TIMEOUT*/, 1);

$mysql->real_connect(***);

不過, 因為在libmysql中有重試機制(嘗試一次, 重試倆次), 所以, 最終我們設定的逾時閾值都會三倍於我們設定的值.

也就是說, 如果我們設定了MYSQL_OPT_READ_TIMEOUT為1, 最終會在3s以後逾時結束. 也就是說, 我們目前能設定的最短逾時時, 就是3秒…

雖說大了點,, 不過總比沒有好, 呵呵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.