diff options
-rw-r--r-- | ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt | 37 | ||||
-rw-r--r-- | ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt | 36 | ||||
-rw-r--r-- | ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt | 37 | ||||
-rw-r--r-- | ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt | 36 | ||||
-rw-r--r-- | ext/mysqlnd/mysqlnd.c | 4 | ||||
-rw-r--r-- | ext/mysqlnd/mysqlnd.h | 1 | ||||
-rw-r--r-- | ext/mysqlnd/php_mysqlnd.c | 2 |
7 files changed, 153 insertions, 0 deletions
diff --git a/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt b/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt new file mode 100644 index 0000000000..d54cb50708 --- /dev/null +++ b/ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt @@ -0,0 +1,37 @@ +--TEST-- +mysqlnd.net_read_timeout > default_socket_timeout +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +require_once('connect.inc'); +?> +--INI-- +default_socket_timeout=1 +mysqlnd.net_read_timeout=12 +max_execution_time=12 +--FILE-- +<?php + set_time_limit(12); + include ("connect.inc"); + + if (!$link = my_mysql_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[001] Connect failed, [%d] %s\n", mysql_errno(), mysqlerror()); + } + + if (!$res = mysql_query("SELECT SLEEP(6)", $link)) + printf("[002] [%d] %s\n", mysql_errno($link), mysql_error($link)); + + var_dump(mysql_fetch_assoc($res)); + + mysql_free_result($res); + mysql_close($link); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(6)"]=> + %unicode|string%(1) "0" +} +done!
\ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt new file mode 100644 index 0000000000..5d169b3a6b --- /dev/null +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt @@ -0,0 +1,36 @@ +--TEST-- +mysqlnd.net_read_timeout limit check +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +require_once('connect.inc'); +if (!$IS_MYSQLND) + /* The libmysql read_timeout limit default is 365 * 24 * 3600 seconds. It cannot be altered through PHP API calls */ + die("skip mysqlnd only test"); +?> +--INI-- +default_socket_timeout=60 +max_execution_time=60 +mysqlnd.net_read_timeout=1 +--FILE-- +<?php + include ("connect.inc"); + + if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + if (!$res = mysqli_query($link, "SELECT SLEEP(5)")) + printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +Warning: mysqli_query(): MySQL server has gone away in %s on line %d + +Warning: mysqli_query(): Error reading result set's header in %s on line %d +[002] [%d] %s +done!
\ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt new file mode 100644 index 0000000000..d977c78b6a --- /dev/null +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt @@ -0,0 +1,37 @@ +--TEST-- +mysqlnd.net_read_timeout > default_socket_timeout +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +require_once('connect.inc'); +?> +--INI-- +default_socket_timeout=1 +mysqlnd.net_read_timeout=12 +max_execution_time=12 +--FILE-- +<?php + set_time_limit(12); + include ("connect.inc"); + + if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + if (!$res = mysqli_query($link, "SELECT SLEEP(6)")) + printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($res->fetch_assoc()); + + mysqli_free_result($res); + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(6)"]=> + %unicode|string%(1) "0" +} +done!
\ No newline at end of file diff --git a/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt new file mode 100644 index 0000000000..dbfd53c75d --- /dev/null +++ b/ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt @@ -0,0 +1,36 @@ +--TEST-- +mysqlnd.net_read_timeout = 0 +--SKIPIF-- +<?php +require_once('skipif.inc'); +require_once('skipifconnectfailure.inc'); +require_once('connect.inc'); +?> +--INI-- +default_socket_timeout=10 +max_execution_time=10 +mysqlnd.net_read_timeout=0 +--FILE-- +<?php + include ("connect.inc"); + + if (!$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket)) { + printf("[001] Connect failed, [%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()); + } + + if (!$res = mysqli_query($link, "SELECT SLEEP(2)")) + printf("[002] [%d] %s\n", mysqli_errno($link), mysqli_error($link)); + + var_dump($res->fetch_assoc()); + + mysqli_free_result($res); + mysqli_close($link); + + print "done!"; +?> +--EXPECTF-- +array(1) { + [%u|b%"SLEEP(2)"]=> + %unicode|string%(1) "0" +} +done!
\ No newline at end of file diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c index b9d3ce0501..e5dc531e23 100644 --- a/ext/mysqlnd/mysqlnd.c +++ b/ext/mysqlnd/mysqlnd.c @@ -627,6 +627,10 @@ PHPAPI MYSQLND *mysqlnd_connect(MYSQLND *conn, mnd_efree(hashed_details); } + if (!conn->options.timeout_read) { + /* should always happen because read_timeout cannot be set via API */ + conn->options.timeout_read = (unsigned int) MYSQLND_G(net_read_timeout); + } if (conn->options.timeout_read) { tv.tv_sec = conn->options.timeout_read; diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h index 687b989303..06bab76f9b 100644 --- a/ext/mysqlnd/mysqlnd.h +++ b/ext/mysqlnd/mysqlnd.h @@ -374,6 +374,7 @@ ZEND_BEGIN_MODULE_GLOBALS(mysqlnd) #ifdef MYSQLND_THREADED THREAD_T thread_id; #endif + long net_read_timeout; ZEND_END_MODULE_GLOBALS(mysqlnd) ZEND_EXTERN_MODULE_GLOBALS(mysqlnd); diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index 7ebb748024..55a56ce90c 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -136,6 +136,7 @@ static PHP_GINIT_FUNCTION(mysqlnd) mysqlnd_globals->dbg = NULL; /* The DBG object*/ mysqlnd_globals->net_cmd_buffer_size = 2048; mysqlnd_globals->net_read_buffer_size = 32768; + mysqlnd_globals->net_read_timeout = 31536000; mysqlnd_globals->log_mask = 0; } /* }}} */ @@ -149,6 +150,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("mysqlnd.debug", NULL, PHP_INI_SYSTEM, OnUpdateString, debug, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.net_cmd_buffer_size", "2048", PHP_INI_ALL, OnUpdateLong, net_cmd_buffer_size, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.net_read_buffer_size", "32768",PHP_INI_ALL, OnUpdateLong, net_read_buffer_size, zend_mysqlnd_globals, mysqlnd_globals) + STD_PHP_INI_ENTRY("mysqlnd.net_read_timeout", "31536000", PHP_INI_SYSTEM, OnUpdateLong, net_read_timeout, zend_mysqlnd_globals, mysqlnd_globals) STD_PHP_INI_ENTRY("mysqlnd.log_mask", "0", PHP_INI_ALL, OnUpdateLong, log_mask, zend_mysqlnd_globals, mysqlnd_globals) PHP_INI_END() /* }}} */ |