PHP警告:require_once:无法打开流:没有这样的文件或目录

时间:2018-06-01 10:14:26

标签: php runtime-error

我的所有PHP脚本都有一个公共文件default.php

该文件位于我的应用程序的根文件夹中。 它定义了一些常量,变量,函数和错误处理。 它还会加载配置文件。

在我上次合并到生产服务器后,我发现了一种奇怪的行为。

$sudo -u apache php /var/www/html/PDR/src/php/pages/menu-tiles.php 

PHP Warning:  require_once(../../../default.php): failed to open stream: No such file or directory in /var/www/html/PDR/src/php/pages/menu-tiles.php on line 18
PHP Fatal error:  require_once(): Failed opening required '../../../default.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/html/PDR/src/php/pages/menu-tiles.php on line 18

但文件在那里:

ls -la /var/www/html/PDR/src/php/pages/../../../default.php
-rw-r--r-- 1 apache apache 4554  1. Jun 00:44 /var/www/html/PDR/src/php/pages/../../../default.php

apache用户也有读权限。

为什么PHP告诉我,有No such file

1 个答案:

答案 0 :(得分:0)

TL; DR:如果在所需文件中发生异常/错误,则可能引发错误。

实际上,错误信息完全是误导性的。

PHP找到了该文件。 PHP编译了该文件。 PHP执行了该文件。

但default.php还会加载另一个文件来查找类:

$List_of_branch_objects = branch::read_branches_from_database();

该类加载另一个类来查询数据库。

$result = database_wrapper::instance()->run($sql_query);

database_wrapper使用配置(见下文)。但$config['database_host']设置不正确。因此数据库连接失败。但PHP给我的唯一错误是No such file

public static function instance() {
    if (self::$instance === null) {
        self::$instance = new self;
    }
    return self::$instance;
}
function __construct() {
    global $config;
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
        PDO::ATTR_EMULATE_PREPARES => FALSE,
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    );
    $this->database_host = $config['database_host'];
    $this->database_name = $config['database_name'];
    $this->database_port = $config['database_port'];
    $this->database_user_name = $config['database_user'];
    $this->database_password = $config['database_password'];
    if (!empty($this->database_port) and 3306 != $this->database_port) {
        $port_string = 'port=' . $this->database_port . ';';
    } else {
        $port_string = '';
    }
    $dsn = 'mysql:host=' . $this->database_host . ';' . $port_string . 'dbname=' . $this->database_name . ';charset=utf8';
    $this->pdo = new PDO($dsn, $this->database_user_name, $this->database_password, $options);
}

找到错误的来源对我来说是个噩梦,因为它出现在生产服务器上。它在同一台机器上的测试文件夹中运行完全正常,完全相同的PHP和apache。