php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #38162 Cannot specify different config files by PHP version
Submitted: 2006-07-20 14:24 UTC Modified: 2010-04-12 18:21 UTC
From: RQuadling at GMail dot com Assigned: rquadling (profile)
Status: Closed Package: *General Issues
PHP Version: 5CVS-2006-07-20 (snap) OS: Windows XP SP2
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: RQuadling at GMail dot com
New email:
PHP Version: OS:

 

 [2006-07-20 14:24 UTC] RQuadling at GMail dot com
Description:
------------
PHP doesn't allow for version specific config files (or registry settings).

The following patch will allow this.

Index: main/php_ini.c
===================================================================
RCS file: /repository/php-src/main/php_ini.c,v
retrieving revision 1.143
diff -u -r1.143 php_ini.c
--- main/php_ini.c	4 Jul 2006 06:38:32 -0000	1.143
+++ main/php_ini.c	18 Jul 2006 08:36:34 -0000
@@ -293,6 +293,7 @@
 		static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
 #ifdef PHP_WIN32
 		char *reg_location;
+		int version_specific;
 #endif
 
 		env_location = getenv("PHPRC");
@@ -318,14 +319,17 @@
 
 #ifdef PHP_WIN32
 		/* Add registry location */
-		reg_location = GetIniPathFromRegistry();
-		if (reg_location != NULL) {
-			if (*php_ini_search_path) {
-				strcat(php_ini_search_path, paths_separator);
+		/* RAQ : Add version specific registry location */
+		for (version_specific = MAX_VERSION_SPECIFIC ; version_specific >= NOT_VERSION_SPECIFIC ; --version_specific)
+			{
+			reg_location = GetIniPathFromRegistry(version_specific);
+			if (reg_location != NULL) {
+				if (*php_ini_search_path) {
+					strcat(php_ini_search_path, paths_separator);
+				}
+				strcat(php_ini_search_path, reg_location);
+				efree(reg_location);
 			}
-			strcat(php_ini_search_path, reg_location);
-			efree(reg_location);
-		}
 #endif
 
 		/* Add cwd (only with CLI) */
@@ -428,6 +432,50 @@
 				}
 			}
 		}
+		/* RAQ : Search php%php-version%-%sapi-module-name%.ini file in search path */
+		if (!fh.handle.fp) {
+			const char *fmt = "php%s-%s.ini";
+			char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + strlen(PHP_VERSION));
+			sprintf(ini_fname, fmt, PHP_VERSION, sapi_module.name);
+			fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
+			efree(ini_fname);
+			if (fh.handle.fp) {
+				fh.filename = php_ini_opened_path;
+			}
+		}
+		/* RAQ : Search php%php-major-version%.%php-minor-version%.%php-release-version%-%sapi-module-name%.ini file in search path */
+		if (!fh.handle.fp) {
+			const char *fmt = "php%d.%d.%d-%s.ini";
+			char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 6);
+			sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION, sapi_module.name);
+			fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
+			efree(ini_fname);
+			if (fh.handle.fp) {
+				fh.filename = php_ini_opened_path;
+			}
+		}
+		/* RAQ : Search php%php-major-version%.%php-minor-version%-%sapi-module-name%.ini file in search path */
+		if (!fh.handle.fp) {
+			const char *fmt = "php%d.%d-%s.ini";
+			char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 4);
+			sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, PHP_MINOR_VERSION, sapi_module.name);
+			fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
+			efree(ini_fname);
+			if (fh.handle.fp) {
+				fh.filename = php_ini_opened_path;
+			}
+		}
+		/* RAQ : Search php%php-major-version%-%sapi-module-name%.ini file in search path */
+		if (!fh.handle.fp) {
+			const char *fmt = "php%d-%s.ini";
+			char *ini_fname = emalloc(strlen(fmt) + strlen(sapi_module.name) + 2);
+			sprintf(ini_fname, fmt, PHP_MAJOR_VERSION, sapi_module.name);
+			fh.handle.fp = php_fopen_with_path(ini_fname, "r", php_ini_search_path, &php_ini_opened_path TSRMLS_CC);
+			efree(ini_fname);
+			if (fh.handle.fp) {
+				fh.filename = php_ini_opened_path;
+			}
+		}
 		/* Search php-%sapi-module-name%.ini file in search path */
 		if (!fh.handle.fp) {
 			const char *fmt = "php-%s.ini";
Index: win32/php_registry.h
===================================================================
RCS file: /repository/php-src/win32/php_registry.h,v
retrieving revision 1.4
diff -u -r1.4 php_registry.h
--- win32/php_registry.h	19 Oct 2003 10:22:21 -0000	1.4
+++ win32/php_registry.h	18 Jul 2006 08:36:34 -0000
@@ -1,8 +1,17 @@
 #ifndef PHP_REGISTRY_H
 #define PHP_REGISTRY_H
 
+/* RAQ : Constants to assist in version specificness. */
+#define NOT_VERSION_SPECIFIC 0
+#define MAJOR_VERSION_SPECIFIC 1
+#define MINOR_VERSION_SPECIFIC 2
+#define RELEASE_VERSION_SPECIFIC 3
+#define EXTRA_VERSION_SPECIFIC 4
+/* Maximum version specificness for for() loops. */
+#define MAX_VERSION_SPECIFIC 4
 
 void UpdateIniFromRegistry(char *path TSRMLS_DC);
-char *GetIniPathFromRegistry();
+/* RAQ : Allow for version specificness */
+char *GetIniPathFromRegistry(int version_specific);
 
 #endif /* PHP_REGISTRY_H */
Index: win32/registry.c
===================================================================
RCS file: /repository/php-src/win32/registry.c,v
retrieving revision 1.16
diff -u -r1.16 registry.c
--- win32/registry.c	14 Mar 2005 12:42:05 -0000	1.16
+++ win32/registry.c	18 Jul 2006 08:36:34 -0000
@@ -3,15 +3,66 @@
 
 #define PHP_REGISTRY_KEY "SOFTWARE\\PHP"
 
+#include "php_registry.h"
+
 void UpdateIniFromRegistry(char *path TSRMLS_DC)
 {
 	char *p, *orig_path;
 	HKEY MainKey;
 	char *strtok_buf = NULL;
 
-	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY "\\Per Directory Values", 0, KEY_READ, &MainKey)!=ERROR_SUCCESS) {
-		return;
-	}
+	/* RAQ : Version specificness */
+	int version_specific;
+	char * reg_key;
+
+	/* RAQ : Get default and then version specific entries. */
+	/**
+		version_specific has the following meanings
+		0 = No additional subkeys - SOFTWARE\\PHP\\Per Directory Values
+		1 = PHP_MAJOR_VERSION added - SOFTWARE\\PHP\\V99\\Per Directory Values
+		2 = PHP_MINOR_VERSION added - SOFTWARE\\PHP\\V99.99\\Per Directory Values
+		3 = PHP_RELEASE_VERSION added - SOFTWARE\\PHPV99.99.99\\Per Directory Values
+		4 = PHP_EXTRA_VERSION added - SOFTWARE\\PHP\\V99.99.99-dev\\Per Directory Values - Actually uses the full PHP_VERSION.
+		**/
+	for (version_specific = NOT_VERSION_SPECIFIC ; version_specific <= MAX_VERSION_SPECIFIC ; ++version_specific)
+		{
+		/* RAQ : Build key which may include version specificness */
+		switch(version_specific)
+			{
+			case MAJOR_VERSION_SPECIFIC :
+				reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99\\Per Directory Values"));
+				sprintf(reg_key, "%s\\V%d\\Per Directory Values", 
+					PHP_REGISTRY_KEY, 
+					PHP_MAJOR_VERSION);
+				break;
+			case MINOR_VERSION_SPECIFIC :
+				reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99\\Per Directory Values"));
+				sprintf(reg_key, "%s\\V%d.%d\\Per Directory Values", 
+					PHP_REGISTRY_KEY, 
+					PHP_MAJOR_VERSION, PHP_MINOR_VERSION);
+				break;
+			case RELEASE_VERSION_SPECIFIC :
+				reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99.99\\Per Directory Values"));
+				sprintf(reg_key, "%s\\V%d.%d.%d\\Per Directory Values", 
+					PHP_REGISTRY_KEY, 
+					PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION);
+				break;
+			case EXTRA_VERSION_SPECIFIC :
+				reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V\\Per Directory Values") + strlen(PHP_VERSION));
+				sprintf(reg_key, "%s\\V%s\\Per Directory Values", 
+					PHP_REGISTRY_KEY, 
+					PHP_VERSION);
+				break;
+			default :
+				reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\Per Directory Values"));
+				sprintf(reg_key, "%s\\Per Directory Values", PHP_REGISTRY_KEY);
+				break;
+			}
+		/* RAQ END : Continue with appropriate key. */
+
+		if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_READ, &MainKey)!=ERROR_SUCCESS) {
+			return;
+		}
 
 	orig_path = path = estrdup(path);
 
@@ -55,7 +106,7 @@
 		HKEY hKey;
 		DWORD lType;
 		DWORD values = 0, max_name = 0, max_value = 0, i = 0;
-		
+
 		if (p>path) {
 			*(p-1) = '\\'; /* restore the slash */
 		}
@@ -91,16 +142,53 @@
 	}
 	RegCloseKey(MainKey);
 	efree(orig_path);
+	} /* RAQ : End of version specificness loop */
 }
 
 #define PHPRC_REGISTRY_NAME "IniFilePath"
 
-char *GetIniPathFromRegistry()
+char *GetIniPathFromRegistry(int version_specific)
 {
 	char *reg_location = NULL;
 	HKEY hKey;
-	
-	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
+	char *reg_key = NULL;
+
+	// RAQ : Determine which key to use - may include version specificiness.
+	switch(version_specific)
+		{
+		case MAJOR_VERSION_SPECIFIC :
+			reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99"));
+			sprintf(reg_key, "%s\\V%d", 
+				PHP_REGISTRY_KEY, 
+				PHP_MAJOR_VERSION);
+			break;
+		case MINOR_VERSION_SPECIFIC :
+			reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99"));
+			sprintf(reg_key, "%s\\V%d.%d", 
+				PHP_REGISTRY_KEY, 
+				PHP_MAJOR_VERSION, PHP_MINOR_VERSION);
+			break;
+		case RELEASE_VERSION_SPECIFIC :
+			reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V99.99.99"));
+			sprintf(reg_key, "%s\\V%d.%d.%d", 
+				PHP_REGISTRY_KEY, 
+				PHP_MAJOR_VERSION, PHP_MINOR_VERSION, PHP_RELEASE_VERSION);
+			break;
+		case EXTRA_VERSION_SPECIFIC :
+			reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY) + strlen("\\V") + strlen(PHP_VERSION));
+			sprintf(reg_key, "%s\\V%s", 
+				PHP_REGISTRY_KEY, 
+				PHP_VERSION);
+			break;
+		default :
+			reg_key = (char *) emalloc(strlen(PHP_REGISTRY_KEY));
+			sprintf(reg_key, "%s", PHP_REGISTRY_KEY);
+			break;
+		}
+	/* RAQ END : Continue with appropriate key. */
+
+	/* RAQ : Use potentially version specific registry key : if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, PHP_REGISTRY_KEY, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {*/
+	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, reg_key, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
 		DWORD buflen = MAXPATHLEN;
 		reg_location = emalloc(MAXPATHLEN+1);
 		if(RegQueryValueEx(hKey, PHPRC_REGISTRY_NAME, 0, NULL, reg_location, &buflen) != ERROR_SUCCESS) {


Expected result:
----------------
PHP to support version specific configuration files and registry settings.

Actual result:
--------------
"One size fits all". No ability to distinguish between 1 version and the next.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-07-20 14:55 UTC] tony2001@php.net
Please upload the patch somewhere and put the link here.
 [2006-07-22 22:28 UTC] RQuadling at GMail dot com
http://rquadling.phpnet.us/enhance_ini_and_registry__diff.txt
 [2006-07-26 11:52 UTC] RQuadling at GMail dot com
Stupid bloody site! Lost the file.

http://rquadling.php1h.com/ini_patch.diff.txt
 [2010-04-12 18:21 UTC] rquadling@php.net
-Status: Open +Status: Closed -Package: Feature/Change Request +Package: *General Issues -Assigned To: +Assigned To: rquadling
 [2010-04-12 18:21 UTC] rquadling@php.net
PHP now supports full version and SAPI specific configuration files.
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Sat Jul 26 05:00:02 2025 UTC