簡體   English   中英

PHP警告:require_once:無法打開流:在目錄中沒有這樣的文件或目錄

[英]PHP Warning: require_once: failed to open stream: No such file or directory in

我所有的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

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的完全相同的計算機上的測試文件夾中,它運行得非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM