]> 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..06bab76f9bf464214e17dc61a2fd7853d644af33 100644 (file)
@@ -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..55a56ce90cb45a5d62643283eb0a9fc90714c554 100644 (file)
@@ -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()
 /* }}} */