]> granicus.if.org Git - php/commitdiff
Fix and tests for bug #49511 . mysqlnd and the MySQL Client Library (libmysql) use...
authorUlf Wendel <uw@php.net>
Wed, 16 Sep 2009 15:00:54 +0000 (15:00 +0000)
committerUlf Wendel <uw@php.net>
Wed, 16 Sep 2009 15:00:54 +0000 (15:00 +0000)
ext/mysql/tests/mysql_mysqlnd_read_timeout_long.phpt [new file with mode: 0644]
ext/mysqli/tests/mysqli_mysqlnd_read_timeout.phpt [new file with mode: 0644]
ext/mysqli/tests/mysqli_mysqlnd_read_timeout_long.phpt [new file with mode: 0644]
ext/mysqli/tests/mysqli_mysqlnd_read_timeout_zero.phpt [new file with mode: 0644]
ext/mysqlnd/mysqlnd.c
ext/mysqlnd/mysqlnd.h
ext/mysqlnd/php_mysqlnd.c

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 (file)
index 0000000..d54cb50
--- /dev/null
@@ -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 (file)
index 0000000..5d169b3
--- /dev/null
@@ -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 (file)
index 0000000..d977c78
--- /dev/null
@@ -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 (file)
index 0000000..dbfd53c
--- /dev/null
@@ -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
index b9d3ce05011a2c5084f2d517dbc0b4f2872b2cc3..e5dc531e23bb8221047077e075206a4a01fd2afc 100644 (file)
@@ -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;
index 687b98930355d43a817bf0a5b0d95f76a066579e..79ce62f3ea8fc018b5506e4baaf237a3bbcecd30 100644 (file)
@@ -250,7 +250,7 @@ PHPAPI void mysqlnd_set_local_infile_handler(MYSQLND * const conn, const char *
 #define mysqlnd_select_db(conn, db, db_len)    (conn)->m->select_db((conn), (db), (db_len) TSRMLS_CC)
 #define mysqlnd_ping(conn)                                     (conn)->m->ping((conn) TSRMLS_CC)
 #define mysqlnd_kill(conn, pid)                                (conn)->m->kill_connection((conn), (pid) TSRMLS_CC)
-#define mysqlnd_refresh(conn, options)         (conn)->m->refresh_server((conn), (options) TSRMLS_CC) 
+#define mysqlnd_refresh(conn, options)         (conn)->m->refresh_server((conn), (options) TSRMLS_CC)
 #define mysqlnd_shutdown(conn, level)          (conn)->m->shutdown_server((conn), (level) TSRMLS_CC)
 #define mysqlnd_get_server_version(conn)       (conn)->m->get_server_version((conn))
 #define mysqlnd_set_character_set(conn, cs)    (conn)->m->set_charset((conn), (cs) TSRMLS_CC)
@@ -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);
index 7ebb748024d0f91f2debd86afab62746b99d353f..190038ffb2535d7142214188888e8e02eb19a725 100644 (file)
@@ -107,6 +107,8 @@ PHP_MINFO_FUNCTION(mysqlnd)
        php_info_print_table_row(2, "Command buffer size", buf);
        snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_buffer_size));
        php_info_print_table_row(2, "Read buffer size", buf);
+       snprintf(buf, sizeof(buf), "%ld", MYSQLND_G(net_read_timeout));
+       php_info_print_table_row(2, "Read timeout", buf);
        php_info_print_table_row(2, "Collecting statistics", MYSQLND_G(collect_statistics)? "Yes":"No");
        php_info_print_table_row(2, "Collecting memory statistics", MYSQLND_G(collect_memory_statistics)? "Yes":"No");
        php_info_print_table_end();
@@ -136,6 +138,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 +152,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()
 /* }}} */