diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index e3a6f44b20..b90602ff37 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -56,7 +56,7 @@ * @var string * */ - const CI_VERSION = '3.4.8'; + const CI_VERSION = '3.4.9'; /* * ------------------------------------------------------ diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 61e7adee3c..1427425b5d 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -248,7 +248,7 @@ public function db_connect($persistent = FALSE) */ public function reconnect() { - if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) + if ($this->conn_id !== FALSE && $this->conn_id->query('DO 1') === FALSE) { $this->conn_id = FALSE; } diff --git a/tests/codeigniter/database/Mysqli_reconnect_test.php b/tests/codeigniter/database/Mysqli_reconnect_test.php new file mode 100644 index 0000000000..514961a048 --- /dev/null +++ b/tests/codeigniter/database/Mysqli_reconnect_test.php @@ -0,0 +1,44 @@ +markTestSkipped('Requires the mysqli driver.'); + } + + $db = Mock_Database_Schema_Skeleton::init(DB_DRIVER); + $db->initialize(); + + $deprecations = array(); + set_error_handler(function ($severity, $message) use (&$deprecations) { + $severity === E_DEPRECATED && $deprecations[] = $message; + return TRUE; + }); + + $db->reconnect(); + $alive_after_live_check = ($db->conn_id !== FALSE); + + $config = Mock_Database_DB::config(DB_DRIVER); + $config = $config[DB_DRIVER]; + $admin = new mysqli($config['hostname'], $config['username'], $config['password'], $config['database']); + $admin->query('KILL '.$db->conn_id->thread_id); + $admin->close(); + usleep(200000); + + $db->reconnect(); + $dropped_after_dead_check = ($db->conn_id === FALSE); + + $query = $db->query('SELECT 1 AS one'); + + restore_error_handler(); + + $this->assertSame(array(), $deprecations); + $this->assertTrue($alive_after_live_check); + $this->assertTrue($dropped_after_dead_check); + $this->assertEquals(1, $query->row()->one); + } + +}