Предупреждение PHP: require_once: не удалось открыть поток: нет такого файла или каталога в - PullRequest
0 голосов
/ 01 июня 2018

Все мои 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 голосов
/ 01 июня 2018

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.

...