在一个奇怪的问题上,我一直在拔头发...从我所知道的,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
答案 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”);