我的所有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
?
答案 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。