File access with is_file() and is_dir() cause segfault
I've been pulling my hair out over a strange issue... from what I can tell, is_file()
is causing a segfault when checking a particular file:
if( is_file('/path/to/file.php') ){
exit 'ok';
}else{
exit 'err';
}
Running this code causes an immediate segfault, even before PHP can write the error to its error log.... the Apache child process is killed.
I confirmed that this is the block that's causing the segfault, because I placed an exit;
immediately before the block and that code was reached fine. I also tried is_dir()
on the directory this file is contained in, but that also segfaults:
if( is_dir('/path/to') ){
exit 'ok';
}else{
exit 'err';
}
Does anyone have any idea what could be causing this? The file exists at that location, and I can view/edit it fine with my user account (which is a开发者_开发问答lso the same user Apache runs as), so I don't think it's a permissions issue. Even if it was related to file permissions, shouldn't I be seeing an error in the PHP log?
Also, note that I have been using the same MAMP setup for approximately a year with no issues (and no changes to my extensions), so it's unlikely to be an issue with my setup. Also, I had another developer run this code and he's seeing the same issue on his machine.
Any ideas are much appreciated.
It's happening for both of us on Mac OSX 10.6.8. PHP versions 5.3.1 and 5.3.2.
My machine: MAMP - Apache/2.0.63 (Unix) PHP/5.3.2 DAV/2 mod_ssl/2.0.63 OpenSSL/0.9.7l
My colleague's: XAMPP - Apache/2.2.14 (Unix) mod_python/3.3.1 Python/2.5.4 DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1
I found an old bug effecting PHP 5.3.0 alphas under Apache 2.2.8, I'm skeptical if that would be still present under your system, though.
Here's the original bug report.
Try running the same script through CLI and see if it still segfaults. If it doesn't, then its probably an issue with PHP on that specific version of Apache. If it still segfaults then I would try disabled your extensions one a time in php.ini to see if one of them is causing the issue.
CAVEAT: I know the poster and have access to the code base...
The error in this case was caused by using a constant with a relative value as part of the include. The first file actually did include, subsequent calls to require_once using that constant caused the page to crash. This type of crashing can be replicated by calling:
require_once('../my/non/existant/path.php');
OR
define('MY_PATH', '../../foo/bar/baz'); require_once(MY_PATH.'/some/random/file.php');
In the actual code, the second require_once probably works, but it is on subsequent calls using the MY_PATH constant that causes the crash, since it is no longer relative to the including file.
From what I could tell without an or die on the require_once it will just crash if the file doesn't exist.
require($some_file) or die("Could not include $some_file");
精彩评论