Merge branch 'PHP-7.0' into PHP-7.1

* PHP-7.0:
  Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized before PHP-FPM sets it up)
This commit is contained in:
Tianfang Yang 2017-08-22 01:39:55 -04:00
commit 441487cd05

View File

@ -29,6 +29,9 @@
#include "pdo/php_pdo_driver.h" #include "pdo/php_pdo_driver.h"
#include "php_pdo_oci.h" #include "php_pdo_oci.h"
#include "php_pdo_oci_int.h" #include "php_pdo_oci_int.h"
#ifdef ZTS
#include <TSRM/TSRM.h>
#endif
/* {{{ pdo_oci_functions[] */ /* {{{ pdo_oci_functions[] */
const zend_function_entry pdo_oci_functions[] = { const zend_function_entry pdo_oci_functions[] = {
@ -50,7 +53,7 @@ zend_module_entry pdo_oci_module_entry = {
pdo_oci_functions, pdo_oci_functions,
PHP_MINIT(pdo_oci), PHP_MINIT(pdo_oci),
PHP_MSHUTDOWN(pdo_oci), PHP_MSHUTDOWN(pdo_oci),
NULL, PHP_RINIT(pdo_oci),
NULL, NULL,
PHP_MINFO(pdo_oci), PHP_MINFO(pdo_oci),
PHP_PDO_OCI_VERSION, PHP_PDO_OCI_VERSION,
@ -80,29 +83,67 @@ const ub4 PDO_OCI_INIT_MODE =
/* true global environment */ /* true global environment */
OCIEnv *pdo_oci_Env = NULL; OCIEnv *pdo_oci_Env = NULL;
#ifdef ZTS
/* lock for pdo_oci_Env initialization */
static MUTEX_T pdo_oci_env_mutex;
#endif
/* {{{ PHP_MINIT_FUNCTION /* {{{ PHP_MINIT_FUNCTION
*/ */
PHP_MINIT_FUNCTION(pdo_oci) PHP_MINIT_FUNCTION(pdo_oci)
{ {
php_pdo_register_driver(&pdo_oci_driver); php_pdo_register_driver(&pdo_oci_driver);
#if HAVE_OCIENVCREATE // Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm,
OCIEnvCreate(&pdo_oci_Env, PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL, 0, NULL); // NLS_LANG is not yet available here.
#else
OCIInitialize(PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL); #ifdef ZTS
OCIEnvInit(&pdo_oci_Env, OCI_DEFAULT, 0, NULL); pdo_oci_env_mutex = tsrm_mutex_alloc();
#endif #endif
return SUCCESS; return SUCCESS;
} }
/* }}} */ /* }}} */
/* {{{ PHP_RINIT_FUNCTION
*/
PHP_RINIT_FUNCTION(pdo_oci)
{
if (!pdo_oci_Env) {
#ifdef ZTS
tsrm_mutex_lock(pdo_oci_env_mutex);
if (!pdo_oci_Env) { // double-checked locking idiom
#endif
#if HAVE_OCIENVCREATE
OCIEnvCreate(&pdo_oci_Env, PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL, 0, NULL);
#else
OCIInitialize(PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL);
OCIEnvInit(&pdo_oci_Env, OCI_DEFAULT, 0, NULL);
#endif
#ifdef ZTS
}
tsrm_mutex_unlock(pdo_oci_env_mutex);
#endif
}
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION /* {{{ PHP_MSHUTDOWN_FUNCTION
*/ */
PHP_MSHUTDOWN_FUNCTION(pdo_oci) PHP_MSHUTDOWN_FUNCTION(pdo_oci)
{ {
php_pdo_unregister_driver(&pdo_oci_driver); php_pdo_unregister_driver(&pdo_oci_driver);
OCIHandleFree((dvoid*)pdo_oci_Env, OCI_HTYPE_ENV);
if (pdo_oci_Env) {
OCIHandleFree((dvoid*)pdo_oci_Env, OCI_HTYPE_ENV);
}
#ifdef ZTS
tsrm_mutex_free(pdo_oci_env_mutex);
#endif
return SUCCESS; return SUCCESS;
} }
/* }}} */ /* }}} */