]> granicus.if.org Git - php/commitdiff
Optimized request startup sequence for php.ini without per dir and per host conf
authorDmitry Stogov <dmitry@php.net>
Tue, 15 Apr 2008 11:32:13 +0000 (11:32 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 15 Apr 2008 11:32:13 +0000 (11:32 +0000)
igurations

main/php_ini.c
main/php_ini.h
sapi/cgi/cgi_main.c

index 9906a8f6f7a2b315a74138f07c786682c22c4f2a..cb550331a8e1389cabef9c2580fd360d3bf63f3a 100644 (file)
@@ -50,6 +50,8 @@ typedef struct _php_extension_lists {
 static int is_special_section = 0;
 static HashTable *active_ini_hash;
 static HashTable configuration_hash;
+static int has_per_dir_config = 0;
+static int has_per_host_config = 0;
 PHPAPI char *php_ini_opened_path=NULL;
 static php_extension_lists extension_lists;
 PHPAPI char *php_ini_scanned_files=NULL;
@@ -264,6 +266,7 @@ static void php_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_t
                                        key = key + sizeof("PATH") - 1;
                                        key_len = Z_STRLEN_P(arg1) - sizeof("PATH") + 1;
                                        is_special_section = 1;
+                                       has_per_dir_config = 1;
 
                                /* HOST sections */
                                } else if (!strncasecmp(Z_STRVAL_P(arg1), "HOST", sizeof("HOST") - 1)) {
@@ -271,6 +274,8 @@ static void php_ini_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callback_t
                                        key = key + sizeof("HOST") - 1;
                                        key_len = Z_STRLEN_P(arg1) - sizeof("HOST") + 1;
                                        is_special_section = 1;
+                                       has_per_host_config = 1;
+
                                } else {
                                        is_special_section = 0;
                                }
@@ -733,6 +738,14 @@ PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int
 }
 /* }}} */
 
+/* {{{ php_ini_has_per_dir_config
+ */
+PHPAPI int php_ini_has_per_dir_config(void)
+{
+       return has_per_dir_config;
+}
+/* }}} */
+
 /* {{{ php_ini_activate_per_dir_config
  */
 PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC)
@@ -741,7 +754,7 @@ PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC)
        char *ptr;
 
        /* Walk through each directory in path and apply any found per-dir-system-configuration from configuration_hash */
-       if (path && path_len) {
+       if (has_per_dir_config && path && path_len) {
                ptr = path + 1;
                while ((ptr = strchr(ptr, DEFAULT_SLASH)) != NULL) {
                        *ptr = 0;
@@ -756,13 +769,21 @@ PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC)
 }
 /* }}} */
 
+/* {{{ php_ini_has_per_host_config
+ */
+PHPAPI int php_ini_has_per_host_config(void)
+{
+       return has_per_host_config;
+}
+/* }}} */
+
 /* {{{ php_ini_activate_per_host_config
  */
 PHPAPI void php_ini_activate_per_host_config(char *host, uint host_len TSRMLS_DC)
 {
        zval *tmp;
 
-       if (host && host_len) {
+       if (has_per_host_config && host && host_len) {
                /* Search for source array matching the host from configuration_hash */
                if (zend_hash_find(&configuration_hash, host, host_len, (void **) &tmp) == SUCCESS) {
                        php_ini_activate_config(Z_ARRVAL_P(tmp), PHP_INI_SYSTEM, PHP_INI_STAGE_ACTIVATE TSRMLS_CC);
index 70f3bfca2fbbdf841ec0cceac209cd63f085569f..61e87f6a480b5cd8fb37bcc18fb1f99ceb1ea751 100644 (file)
@@ -34,6 +34,8 @@ PHPAPI int cfg_get_double(char *varname, double *result);
 PHPAPI int cfg_get_string(char *varname, char **result);
 PHPAPI int php_parse_user_ini_file(char *dirname, char *ini_filename, HashTable *target_hash TSRMLS_DC);
 PHPAPI void php_ini_activate_config(HashTable *source_hash, int modify_type, int stage TSRMLS_DC);
+PHPAPI int php_ini_has_per_dir_config(void);
+PHPAPI int php_ini_has_per_host_config(void);
 PHPAPI void php_ini_activate_per_dir_config(char *path, uint path_len TSRMLS_DC);
 PHPAPI void php_ini_activate_per_host_config(char *host, uint host_len TSRMLS_DC);
 PHPAPI HashTable* php_ini_get_configuration_hash(void);
index 7dd9be174f0fcb3097e423b29d7d194d89ec8224..7266b1b3f1ed6450eb8c59ab2f54870841f124bc 100644 (file)
@@ -708,42 +708,47 @@ static int sapi_cgi_activate(TSRMLS_D)
                return FAILURE;
        }
 
-       doc_root = sapi_cgibin_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT") - 1 TSRMLS_CC);
-       server_name = sapi_cgibin_getenv("SERVER_NAME", sizeof("SERVER_NAME") - 1 TSRMLS_CC);
-
-       /* DOCUMENT_ROOT and SERVER_NAME should also be defined at this stage..but better check it anyway */
-       if (!doc_root || !server_name) {
-               return FAILURE;
-       }
-       doc_root_len = strlen(doc_root);
-       if (doc_root[doc_root_len - 1] == '/') {
-               --doc_root_len;
-       }
-
-       /* Prepare search path */
-       path_len = strlen(SG(request_info).path_translated);
-       path = zend_strndup(SG(request_info).path_translated, path_len);
-       php_dirname(path, path_len);
-       path_len = strlen(path);
-
-       /* Make sure we have trailing slash! */
-       if (!IS_SLASH(path[path_len])) {
-               path[path_len++] = DEFAULT_SLASH;
+       if (php_ini_has_per_host_config()) {
+               /* Activate per-host-system-configuration defined in php.ini and stored into configuration_hash during startup */
+               server_name = sapi_cgibin_getenv("SERVER_NAME", sizeof("SERVER_NAME") - 1 TSRMLS_CC);
+               /* SERVER_NAME should also be defined at this stage..but better check it anyway */
+               if (server_name) {
+                       php_ini_activate_per_host_config(server_name, strlen(server_name) + 1 TSRMLS_CC);
+               }
        }
-       path[path_len] = 0;
 
-       /* Activate per-dir-system-configuration defined in php.ini and stored into configuration_hash during startup */
-       php_ini_activate_per_dir_config(path, path_len TSRMLS_CC); /* Note: for global settings sake we check from root to path */
+       if (php_ini_has_per_dir_config() || 
+           (PG(user_ini_filename) && *PG(user_ini_filename))) {
+               /* Prepare search path */
+               path_len = strlen(SG(request_info).path_translated);
+               path = estrndup(SG(request_info).path_translated, path_len);
+               path_len = zend_dirname(path, path_len);
 
-       /* Activate per-host-system-configuration defined in php.ini and stored into configuration_hash during startup */
-       php_ini_activate_per_host_config(server_name, strlen(server_name) + 1 TSRMLS_CC);
+               /* Make sure we have trailing slash! */
+               if (!IS_SLASH(path[path_len])) {
+                       path[path_len++] = DEFAULT_SLASH;
+               }
+               path[path_len] = 0;
+
+               /* Activate per-dir-system-configuration defined in php.ini and stored into configuration_hash during startup */
+               php_ini_activate_per_dir_config(path, path_len TSRMLS_CC); /* Note: for global settings sake we check from root to path */
+
+               /* Load and activate user ini files in path starting from DOCUMENT_ROOT */
+               if (PG(user_ini_filename) && *PG(user_ini_filename)) {
+                       doc_root = sapi_cgibin_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT") - 1 TSRMLS_CC);
+                       /* DOCUMENT_ROOT should also be defined at this stage..but better check it anyway */
+                       if (doc_root) {
+                               doc_root_len = strlen(doc_root);
+                               if (doc_root[doc_root_len - 1] == '/') {
+                                       --doc_root_len;
+                               }
+                               php_cgi_ini_activate_user_config(path, path_len, doc_root_len - 1 TSRMLS_CC);
+                       }
+               }
 
-       /* Load and activate user ini files in path starting from DOCUMENT_ROOT */
-       if (strlen(PG(user_ini_filename))) {
-               php_cgi_ini_activate_user_config(path, path_len, doc_root_len - 1 TSRMLS_CC);
+               efree(path);
        }
 
-       free(path);
        return SUCCESS;
 }