文章來介紹了自定義mysql查詢超時(shí)的時(shí)間長度,下面我們來看看詳細(xì)的設(shè)置方法,首先, 在libmysql中,是提供了MYSQL_OPT_READ_TIMEOUT設(shè)置項(xiàng)的,并且libmysql中提供了設(shè)置相關(guān)設(shè)置項(xiàng)的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;
- /** 讀超時(shí)時(shí)間 */
- 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擴(kuò)展,把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); //Vevb.com
- break;
- }
- RETURN_BOOL(!ret);
- }
但是因?yàn)镸ysqli并沒有導(dǎo)出這個(gè)常量,所以我們需要通過查看MySQL的代碼,得到MYSQL_OPT_READ_TIMEOUT的實(shí)際值,然后直接調(diào)用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,現(xiàn)在,我們就可以設(shè)置查詢超時(shí)了,代碼如下:
- $mysqli = mysqli_init();
- $mysqli->options(11 /*MYSQL_OPT_READ_TIMEOUT*/, 1);
- $mysql->real_connect(***);
不過, 因?yàn)樵趌ibmysql中有重試機(jī)制(嘗試一次, 重試倆次),所以,最終我們?cè)O(shè)置的超時(shí)閾值都會(huì)三倍于我們?cè)O(shè)置的值.
也就是說,如果我們?cè)O(shè)置了MYSQL_OPT_READ_TIMEOUT為1,最終會(huì)在3s以后超時(shí)結(jié)束,也就是說,我們目前能設(shè)置的最短超時(shí)時(shí), 就是3秒…
雖說大了點(diǎn),不過總比沒有好, 呵呵
新聞熱點(diǎn)
疑難解答
圖片精選