【问题标题】:PHP include relative pathPHP包含相对路径
【发布时间】:2013-07-01 15:03:45
【问题描述】:

我有文件 /root/update/test.php。还有一个文件,/root/connect.php;这个文件有一行

include "../config.php";

在 /root/update/test.php 中。有代码

set_include_path(".:/root");
include "connect.php";

当我运行/root/update/test.php时,它找到connect.php,但找不到config.php,给我

PHP Warning:  include(../config.php): failed to open stream: No such file or directory in /root/connect.php on line 2
PHP Warning:  include(): Failed opening '../config.php' for inclusion (include_path='.:/root')

这让我感到困惑,因为这些警告让我觉得我做的一切都是正确的——包含路径是 /root,它正在寻找存在的文件 ../config.php (/config.php)。有人可以帮我解决这个问题吗?请注意,由于部署到我无权访问的生产服务器,因此我不能选择使用绝对路径。

Ubuntu/Apache

【问题讨论】:

  • 我尝试包含相对于您的 CWD(即 /root/update/)的 config.php,并搜索 /root/config.php
  • This: include "../config.php" 将您带到根文件夹的父文件夹。 config.php 在那里吗?
  • config.php的完整路径是什么?
  • 是的,绝对路径是/config.php
  • 就个人而言,我会将所有文件引用更改为绝对的,例如包括 realpath(_DIR_ . '/../') 。 '/config.php';

标签: php


【解决方案1】:

您始终可以使用 __DIR__ 将其包含在内:

include(dirname(__DIR__).'/config.php');

__DIR__ 是一个 'magical constant' 并返回当前文件的目录,不带斜杠。它实际上是一个绝对路径,您只需要将文件名连接到__DIR__。在这种情况下,由于我们需要提升目录,我们使用 PHP 的 dirname 来提升文件树,从这里我们可以访问 config.php

你也可以在这个方法中设置根路径:

define('ROOT_PATH', dirname(__DIR__) . '/');

在 test.php 中会将您的根设置为 /root/ 级别。

include(ROOT_PATH.'config.php');

然后应该努力从您想要的位置包含配置文件。

【讨论】:

  • 如果您打算将这些常量用于相对路径(即../),我建议您在define() 之前使用realpath() 清理它。
  • 我不会使用ROOT_PATH.'../',而是使用dirname(ROOT_PATH)。后者会给你一个“更绝对”的路径。
  • 我在这里开始了一个针对这个频繁错误的故障排除清单:stackoverflow.com/a/36577021/2873507
  • 您应该考虑在 windows dirname(DIR) 中获取目录但带有 windows 斜杠,因此此方法仅适用于 linux 系统
  • 所以有了这个(你的答案),我们使用绝对路径而不是相对路径,对吧?
【解决方案2】:

虽然我感谢您认为绝对路径不是一个选项,但它比相对路径和更新 PHP 包含路径更好的选择。

使用绝对路径和可以根据环境设置的常量。

if (is_production()) {
    define('ROOT_PATH', '/some/production/path');
}
else {
    define('ROOT_PATH', '/root');
}

include ROOT_PATH . '/connect.php';

正如评论,ROOT_PATH 也可以从当前路径、$_SERVER['DOCUMENT_ROOT'] 等派生。

【讨论】:

  • define('ROOT_PATH', __DIR__.'/../');,也许?
  • 这绝对是一个很好的建议,而且确实有效 - 但 DIR 更符合我的要求。 (我不是反对者)
  • 我在这里开始了一个针对这个频繁错误的故障排除清单:stackoverflow.com/a/36577021/2873507
【解决方案3】:
function relativepath($to){
    $a=explode("/",$_SERVER["PHP_SELF"] );
    $index= array_search("$to",$a);
    $str=""; 
    for ($i = 0; $i < count($a)-$index-2; $i++) {
        $str.= "../";
    }
    return $str;
    }

这是我对此提出的最佳解决方案,您只需要指定要停止的级别,但问题是您必须使用此文件夹名称一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2019-04-21
    • 2013-04-09
    相关资源
    最近更新 更多