Per-directory PHP configuration
| From: | Edward Z. Yang | Date: | Mon, 24 Aug 2009 21:46:33 +0000 |
| Subject: | Per-directory PHP configuration | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-45361@lists.php.net to get a copy of this message | ||
Hello all,
I cooked up a patch that gives PHP support for per-directory
php.ini files that properly inherit. This makes php.ini files
act a little like .htaccess files. We are cognizant of the associated
performance issues, and thus this is a strictly optional feature.
For a little history, the current, common approach
is to set PHPRC to be the current directory, so that a php.ini
file from that directory is read. This unfortunately also overloads
the global php.ini file, has an odd ordering with respect to php.d,
and means that you have to place a php.ini file/symlink in every
directory where PHP scripts could be run.
While the patch is no where near where I would be comfortable
formally submitting it for review on internals, I'd like to gauge
how friendly the core PHP developers would be to an enhancement like
this. In a nutshell, here is how the patch works:
In php_ini.c, php_init_config() is patched to call php_user_init_config()
if user directory php.ini's are accepted. The function then:
1. Retrieves the current working directory
2. Checks if the cwd is inside the user's home directory
3. Successively walks up from the user's home directory to the
cwd, checking if a php.ini exists and loading it with
zend_parse_ini_file if it does.
We also have two special cases of behavior that we found helpful for our
use-case:
* We serve only a user's ~/web_scripts directory, so perform an optional
check to make sure the PHP file is in the right place, and to not
attempt to load ~/php.ini
* If we had Apache frob $HOME such that it points to a "different" home
directory, which is the web serve directory, skip the previous check.
To get an idea for its behaviors, take the following example:
/etc/php.ini
foo = 1
bar = 1
/mit/user/web_scripts/wiki/php.ini
foo = 2
Then, we see the following behavior for the following PHP scripts
/mit/user/web_scripts/test.php
foo = 1
bar = 1
/mit/user/web_scripts/wiki/test.php
foo = 2
bar = 1
/mit/user/web_scripts/wiki/subdir/test.php
foo = 2
bar = 1
I am looking forward to your comments, and I can post the very rough
(but functional) patch if you are so interested.
Cheers,
Edward