Php.ini not loading?

I beat my head against this one for hours. A recompiled version of PHP 5.1.6 on OS X was simply not loading my php.ini, even though a valid file existed in the place specified by the –with-config-file-path configure setting (/etc), and no other php.ini files existed on the system.
Eventually, after many rebuilds, I downloaded a clean copy of the source, rebuilt from scratch and voila – it worked. however, changing it and recompiling prodiced the broken results again. make distclean and a rebuild made it ork again. So, if you’re seeing this problem, a clean recompile (don’t forget to use config.nice) should make it all work again.
I’m not sure if this is a PHP bug or not – is it meant to work?

Error-free PHP

Not nearly as good as it sounds. I’ve become plagued by a very irritating problem over the last couple of weeks – I’m getting no error output from PHP whatsoever, neither to the browser nor to logs, even though all such options are enabled. My config files are as stock as they can be and still work. It’s just making debugging nearly impossible. I’m getting the same symptoms on OS X and RedHat EL4, so it’s not a platform-dependent thing. They are also on different versions of Apache (2.0.54-12 from Fink and 2.0.52 from RHN). Grrr.

I found it!! Really silly issue and it explains everything. There was a .htaccess file containing an old line:

php_value display_errors true

It appears that (unlike in the rest of PHP) ‘true’ is interpreted as boolean false in this context. Commenting it out or setting it to 1 makes it work.

Beware of the MultiView

I’ve been seeing some very confusing behaviour involving mod_rewrite and PHP.

I have this rewrite rule in a .htaccess file (it just allows me to see what the incoming URL looked like for test purposes):

RewriteRule (*.) x.php?x=$1 [R,L]

If I feed it a URL like:

it matches the whole thing/123 part and maps it to my desired URL:

That’s all fine. Now the weird bit. If I happen to have a script with the same base name as the matching path part, like “thing.php”, it gets magically picked up and inserted into the URL, so I end up with:

Huh?! How did the ‘.php’ get in there?

Now because this rule is in a .htaccess file, it’s handled last in the chain of things that apache might do (and there are no other rewrite rules), it must be something further upstream that’s mapping ‘thing’ to ‘thing.php’. My first idea was that it might be looking inside thing.php (using mime_magic) and mapping its type, and file extension, according to the AddType directive that PHP is enabled by. However, turning off mime magic doesn’t stop it happening, so it’s not that.

It DOES stop doing it if I disable PHP – but why should PHP be involved in this at all? The final URL will eventually hit PHP, but because in this case I’m using [R] (which forces an external redirect) in the rewrite rule, PHP won’t see that until the request returns from the browser.

Is there some automatic aliasing thing that suggests that files without extensions might be some other kind of file? Well, that sounds like a fair description of the kind of thing that Apache’s MultiViews do. Surprise surprise – I turn MultiViews off and it all starts acting normally. As yet I’ve not figured out how to stop it a little more selectively (as MultiViews are a nice feature otherwise), but I can live without them for now.