summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/mysql/php_mysql.c2
-rw-r--r--ext/mysqli/mysqli_nonapi.c2
-rw-r--r--ext/mysqlnd/mysqlnd.c20
-rw-r--r--ext/mysqlnd/mysqlnd.h7
4 files changed, 22 insertions, 9 deletions
diff --git a/ext/mysql/php_mysql.c b/ext/mysql/php_mysql.c
index 140d945003..0e5319cb21 100644
--- a/ext/mysql/php_mysql.c
+++ b/ext/mysql/php_mysql.c
@@ -791,7 +791,7 @@ static void php_mysql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
}
} else {
#ifdef MYSQL_USE_MYSQLND
- mysqlnd_restart_psession(mysql->conn);
+ mysqlnd_restart_psession(mysql->conn, MySG(mysqlnd_thd_zval_cache));
#endif
}
}
diff --git a/ext/mysqli/mysqli_nonapi.c b/ext/mysqli/mysqli_nonapi.c
index 27e6b4ebd4..8c67e30799 100644
--- a/ext/mysqli/mysqli_nonapi.c
+++ b/ext/mysqli/mysqli_nonapi.c
@@ -170,7 +170,7 @@ void mysqli_common_connect(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_real_conne
if (!mysql_ping(mysql->mysql)) {
#endif
#ifdef MYSQLI_USE_MYSQLND
- mysqlnd_restart_psession(mysql->mysql);
+ mysqlnd_restart_psession(mysql->mysql, MyG(mysqlnd_thd_zval_cache));
#endif
MyG(num_active_persistent)++;
goto end;
diff --git a/ext/mysqlnd/mysqlnd.c b/ext/mysqlnd/mysqlnd.c
index 6394e0f06a..cd21ebed56 100644
--- a/ext/mysqlnd/mysqlnd.c
+++ b/ext/mysqlnd/mysqlnd.c
@@ -442,7 +442,7 @@ MYSQLND_METHOD(mysqlnd_conn, set_server_option)(MYSQLND * const conn,
/* {{{ _mysqlnd_restart_psession */
-PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC)
+PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC)
{
DBG_ENTER("_mysqlnd_restart_psession");
MYSQLND_INC_CONN_STATISTIC(&conn->stats, STAT_CONNECT_REUSED);
@@ -451,15 +451,27 @@ PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC)
mnd_pefree(conn->last_message, conn->persistent);
conn->last_message = NULL;
}
+ conn->zval_cache = cache;
DBG_VOID_RETURN;
}
/* }}} */
-/* {{{ mysqlnd_end_psession */
-PHPAPI void mysqlnd_end_psession(MYSQLND *conn)
+/* {{{ _mysqlnd_end_psession */
+PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC)
{
-
+ DBG_ENTER("_mysqlnd_end_psession");
+ /*
+ BEWARE!!!! This will have a problem with a query cache.
+ We need to move the data out of the zval cache before we end the psession.
+ Or we will use nirvana pointers!!
+ */
+ if (conn->zval_cache) {
+ DBG_INF("Freeing zval cache reference");
+ mysqlnd_palloc_free_thd_cache_reference(&conn->zval_cache);
+ conn->zval_cache = NULL;
+ }
+ DBG_VOID_RETURN;
}
/* }}} */
diff --git a/ext/mysqlnd/mysqlnd.h b/ext/mysqlnd/mysqlnd.h
index 9e6c0e665d..cc6afab51c 100644
--- a/ext/mysqlnd/mysqlnd.h
+++ b/ext/mysqlnd/mysqlnd.h
@@ -67,9 +67,10 @@
void mysqlnd_library_init(TSRMLS_D);
void mysqlnd_library_end(TSRMLS_D);
-#define mysqlnd_restart_psession(conn) _mysqlnd_restart_psession((conn) TSRMLS_CC)
-PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn TSRMLS_DC);
-PHPAPI void mysqlnd_end_psession(MYSQLND *conn);
+#define mysqlnd_restart_psession(conn, cache) _mysqlnd_restart_psession((conn), (cache) TSRMLS_CC)
+PHPAPI void _mysqlnd_restart_psession(MYSQLND *conn, MYSQLND_THD_ZVAL_PCACHE *cache TSRMLS_DC);
+#define mysqlnd_end_psession(conn) _mysqlnd_end_psession((conn) TSRMLS_CC)
+PHPAPI void _mysqlnd_end_psession(MYSQLND *conn TSRMLS_DC);
PHPAPI void mysqlnd_minfo_print_hash(zval *values);
#define mysqlnd_thread_safe() TRUE