【问题标题】:require/require_once "../" breaks loading of page without throwing errorrequire/require_once "../" 中断页面加载而不抛出错误
【发布时间】:2019-02-16 21:29:57
【问题描述】:

工作目录:

rootDir
    dir1
            file1.php
    dir2
            file2.php
    main.php

main 需要 file1,而 file1 需要 file2。 Main 可以要求 file1 没有问题。但是 file1 不能要求 file2。我最初尝试要求 file2(在 file1 中):

require_once '../dir2/file2.php';

当我访问 main.php 时,我只得到一个白页,没有任何东西被发送到客户端。所以我试着捕捉一个异常:

try {
    require_once '../dir2/file2.php';
    echo "Succesfully required file";
} catch (Exception $e) {
    echo $e->getMessage();
}

这也会导致白屏。不显示错误消息,不写入回显。 我发现需要file2的唯一方法:

$root = realpath($_SERVER['DOCUMENT_ROOT']);
require_once "{$root}/rootDir/dir2/file2.php";

为什么 '../' 不起作用?

编辑:

更好的解决方案是(感谢:@Ulrich Eckhardt 和 @Paulpro)

require_once __DIR__ . '/../dir2/file2.php';

【问题讨论】:

  • 我可能错了,但这是相对于 main. require_once 可以视为所需文件的复制/粘贴。然后,file1 中的一些相对路径将相对于 main,因此找不到文件
  • 如果你echo $_SERVER['DOCUMENT_ROOT'] 是什么结果?
  • @alex55132 它返回 /var/www/html rootDir 在 /var/www/html/rootDir
  • 路径是相对于入口点main.php而不是file1.php;这意味着如果 file1.php 可能包含在不同目录中的入口点中,则相对路径将不起作用。您应该使用 __DIR__ 指定相对于 file1 所在目录的路径,如下所示:require_once __DIR__ . '/../dir2/file2.php';

标签: php


【解决方案1】:

我个人不希望相对路径以任何特定方式工作。问题是传统上(即在大多数操作系统功能中),路径是相对于进程的当前工作目录(CWD)解释的,但在这里您可能希望它相对于当前文件的目录工作。不要使用相对路径,而是明确并使用__DIR__ 指定当前文件的目录:

require_once __DIR__ . '/../dir2/file2.php';

【讨论】:

  • 您在编辑 @Alex 时遗漏了 /,它必须是 /../
  • @Paulpro 修复了它。谢谢
  • @Alex 没问题。需要明确的是,在 file1.php __DIR__ 内部将是 '/var/www/html/rootDir/dir1' 所以没有 / 你有 '/var/www/html/rootDir/dir1../dir2/file2.php'
猜你喜欢
  • 1970-01-01
  • 2011-08-28
  • 2014-07-11
  • 2016-09-07
  • 2012-02-10
  • 2021-10-24
  • 1970-01-01
  • 2020-04-19
  • 2022-11-23
相关资源
最近更新 更多