【问题标题】:File access with is_file() and is_dir() cause segfault使用 is_file() 和 is_dir() 访问文件会导致段错误
【发布时间】:2011-10-30 21:40:53
【问题描述】:

我一直在为一个奇怪的问题而烦恼...据我所知,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

【问题讨论】:

  • 很奇怪。可以添加操作系统、服务器和 PHP 信息吗?
  • 我们俩都在 Mac OSX 10.6.8 上发生。 PHP 版本 5.3.1 和 5.3.2。
  • 这是否仅通过 PHP 发生?你能直接从 PHP 外部读取这个文件吗?
  • Apache/2.0.63 (Unix) PHP/5.3.2 DAV/2 mod_ssl/2.0.63 OpenSSL/0.9.7l
  • PHP 中的 Segfault 是一个错误。阅读:bugs.php.net/bugs-generating-backtrace.php 并在 bugs.php.net 上提交错误。

标签: php apache segmentation-fault


【解决方案1】:

CAVEAT:我知道发帖者并且可以访问代码库...

这种情况下的错误是由于使用具有相对值的常量作为包含的一部分而引起的。第一个文件实际上确实包含,随后使用该常量调用 require_once 导致页面崩溃。这种类型的崩溃可以通过调用来复制:

require_once('../my/non/existant/path.php');

define('MY_PATH', '../../foo/bar/baz'); require_once(MY_PATH.'/some/random/file.php');

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

据我所知,在 require_once 上没有 or 的情况下,如果文件不存在,它只会崩溃。

require($some_file) or die("Could not include $some_file");

【讨论】:

    【解决方案2】:

    我在 Apache 2.2.8 下发现了一个影响 PHP 5.3.0 alpha 的旧错误,但我怀疑它是否仍然存在于您的系统下。

    这是原始的bug report

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多