使用is_file()和is_dir()进行文件访问会导致段错误

时间:2011-08-19 19:59:53

标签: php apache segmentation-fault

在一个奇怪的问题上,我一直在拔头发...从我所知道的,is_file()在检查特定文件时会导致段错:

if( is_file('/path/to/file.php') ){
    exit 'ok';
}else{
    exit 'err';
}

运行此代码会导致立即发生段错误,即使在PHP将错误写入其错误日志之前...... Apache子进程也会被终止。

我确认这是导致段错误的块,因为我在块之前放置了一个exit;并且该代码已经达到了。我还在包含此文件的目录上尝试了is_dir(),但这也是段错误:

if( is_dir('/path/to') ){
    exit 'ok';
}else{
    exit 'err';
}

有谁知道可能导致这种情况的原因是什么?该文件存在于该位置,我可以使用我的用户帐户(也是与Apache运行的用户相同)查看/编辑它,因此我认为这不是权限问题。即使它与文件权限相关,我不应该在PHP日志中看到错误吗?

另外,请注意我一直使用相同的MAMP设置大约一年没有问题(并且我的扩展没有变化),所以它不太可能是我的设置问题。另外,我让另一个开发人员运行此代码,他在他的机器上看到了同样的问题。

非常感谢任何想法。

在Mac OSX 10.6.8上我们俩都在发生这种情况。 PHP版本5.3.1和5.3.2。

我的机器: MAMP - Apache / 2.0.63(Unix)PHP / 5.3.2 DAV / 2 mod_ssl / 2.0.63 OpenSSL / 0.9.7l

我的同事: 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

2 个答案:

答案 0 :(得分:1)

我在Apache 2.2.8下发现了一个影响PHP 5.3.0 alphas的旧bug,但我对你的系统中是否会出现这种情况持怀疑态度。

这是原始bug report

尝试通过CLI运行相同的脚本,看看它是否仍然是段错误。如果没有,那么它可能是PHP在该特定版本的Apache上的一个问题。如果它仍然是段错误,那么我会尝试在php.ini中一次禁用你的扩展,看看其中一个是否导致了这个问题。

答案 1 :(得分:0)

CAVEAT:我知道海报,可以访问代码库......

这种情况下的错误是由于使用具有相对值的常量作为include的一部分引起的。第一个文件确实包括,后续使用该常量调用require_once导致页面崩溃。可以通过调用:

来复制这种类型的崩溃

require_once( '../我/非/ existant / path.php');

OR

define('MY_PATH','.. / .. / foo / bar / baz'); require_once(my_path的 '/一些/无规/ file.php');

在实际代码中,第二个require_once可能有效,但是在后续调用中使用导致崩溃的MY_PATH常量,因为它不再相对于包含文件。

如果文件不存在,那么在require_once没有或死的情况下,它就会崩溃。

require($ some_file)或die(“不能包含$ some_file”);