首先, 在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秒…
雖說大了點,, 不過總比沒有好, 呵呵