dsds33222 2011-08-19 19:59
浏览 155
已采纳

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

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 also 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

  • 写回答

2条回答 默认 最新

  • dongyi5570 2011-08-19 20:18
    关注

    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");

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题