【问题标题】:PHP Suddenly stop searching for files in current directoryPHP突然停止在当前目录中搜索文件
【发布时间】:2011-08-23 22:41:24
【问题描述】:

所以我今天遇到了一件很奇怪的事情。

我已将我的 PHP APC 更新到最新版本并重新启动了 apache。然后突然 apache 中的所有脚本开始抱怨找不到所需的文件。

我通常会:

require_once 'Abstract.php'

考虑到 Abstract.php 与其他脚本位于同一目录中。

错误在哪里:

PHP 警告: require_once(Abstract.php) [function.require-once]: 无法打开流:没有这样的文件或 第 411 行 PHP 中 data.php 中的目录 致命错误:require_once() [function.require]: 打开失败需要“Abstract.php” (include_path='/var/www/application/../library:/var/www/library:.:/usr/share/php:/usr/share/pear') 在第 411 行的 data.php 中

如您所见,当前目录 (.) 包含在执行的 include_path 中。为什么会这样?有人见过吗?

【问题讨论】:

  • 尝试使用 strace 访问 apache 进程,看看它到底做了什么(grep 表示“open”)。
  • 对于试图访问 data.php 文件的 Apache 用户来说,“读取”权限是否正确?
  • 如果你 require_once dirname( __FILE__ ) . '/Abstract.php'; 会发生什么?
  • (附带说明:当前目录应该始终是包含路径的一部分)
  • 我是 APC 错误。 pecl.php.net/bugs/bug.php?id=22687 ...

标签: php apc require-once


【解决方案1】:

AFAIK,. 表示 PHP 二进制文件所在的目录。 require*include* 函数考虑到当前工作目录,可以通过chdir()修改。

按照cwallenpoole 的建议,尝试使用__DIR__ 常量:

require_once __DIR__ . '/Abstract.php';

如果这也失败了,则意味着其他地方存在错误配置。如果有效,则可能意味着当前正在执行的 PHP 线程的工作目录设置为不同,您需要更改当前工作目录或修改 require 语句以使用绝对路径。

另外,您是否考虑过使用自动加载回调?这样,您就有了一个单一的入口点来搜索课程。

【讨论】:

    【解决方案2】:

    好的,我最终想通了,尽管我应该分享一下,以防其他人遇到和我一样的麻烦。

    我曾经拥有 APC 3.0.x 并升级到 3.1.8。似乎 3.1.8 上的 APC 有一个错误,会破坏 PHP 的包含/要求。

    在此处查看相关链接:http://pecl.php.net/bugs/bug.php?id=22687

    感谢大家的快速反馈:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多