【问题标题】:include file on file included on file with relative path: working only sometimes包含在文件中的文件 包含在具有相对路径的文件中:仅有时工作
【发布时间】:2013-05-21 07:01:37
【问题描述】:

我的网站结构是这样的。

HTDOCS 文件夹:/WEB/mysite/htdocs/

管理员文件夹:/WEB/mysite/htdocs/admin/

编辑管理员文件夹:/WEB/mysite/htdocs/admin/edit

HTACCESS 保护文件夹:/WEB/mysite/htdocs/admin/flock/

测试文件夹:/WEB/mysite/htdocs/test/

情况 1

下面的script1.php放在Admin文件夹里:

<?php
require_once 'flock/sql.php' or die("Error");
?>

现在我将 script1.php 包含在位于 Edit admin 文件夹中的 scripttest.php 中:

<?php
require_once '../script1.php' or die ("Error");
?>

它可以正常工作。

情况 2

现在我将 script2.php 放在了 Test 文件夹中:

<?php
require_once '../admin/flock/sql.php' or die("Error");
?>

并从始终放置在 Edit admin 文件夹中的 scripttest.php 调用它:

<?php
require_once '../../test/script2.php';
?>

而且它不再起作用了。这些是错误:

Warning: require_once() [function.require-once]:
Unable to access ../admin/flock/sql.php in /WEB/mysite/htdocs/test/script2.php
on line 2

Warning: require_once(../admin/flock/sql.php) [function.require-once]:
failed to open stream: No such file or directory in /WEB/mysite/htdocs/test/script2.php
on line 2

Fatal error: require_once() [function.require]: Failed opening required
'../admin/flock/sql.php' (include_path='/usr/local/lib/php/:/WEB/mysite/') in
/WEB/mysite/htdocs/test/script2.php on line 2.

这两种情况是一回事。不是吗? 为什么第二种情况不起作用?

【问题讨论】:

    标签: php path include require


    【解决方案1】:

    相对路径就像相对方向,如果我告诉你向前走两步,向左走一步,那么只有每次从同一个地方开始,你才会最终到达正确的地方。 php 的起点是主脚本的执行开始的地方。为了让生活更健康,您需要建立几个可以包含的航路点。

    一些常见的有:

    1. $_SERVER["DOCUMENT_ROOT"] - 这是您的域根目录(与转到 http://www.mysite.com/ 相关的文件系统路径)
    2. __DIR__ - 一个常量,即当前文件的目录。

    通常,最好创建一个常量来建立一个对您的项目有意义的位置...例如。

    // site_config.php -- located in a config directory next to your document root.
    define("COMMON_INCLUDES", $_SERVER["DOCUMENT_ROOT"]."/includes");
    

    site_config.php 然后将通过以下方式包含在您的所有页面中:

    include($_SERVER["DOCUMENT_ROOT"]."/../config/site_config.php");
    

    当您需要包含资产之外的资产时,您会说

    include(COMMON_INCLUDES."/header.php");
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢。但如果我理解正确的话:include(COMMON_INCLUDES."/header.php"); 将与:include $_SERVER['DOCUMENT_ROOT'].'/includes/header.php 相同。那么如果header.php 在另一个目录上怎么办......我将不得不再次使用相对路径?!那么总是使用include $_SERVER['DOCUMENT_ROOT'].'/pathtothefile/file.php'并停止使用相对路径不是更简单吗?
    • 这样会安全得多。添加我概述的常量的抽象是一个很好的方法,如果您有一个开发版本的站点,由于某种原因或其他原因不能存在于站点根目录上。然后对于那个,您可以将常量更改为define("INCLUDE_PATH", $_SERVER["DOCUMENT_ROOT"]."/mydevsite/includes");,它在将站点部署在不同环境中时提供了更大的灵活性。
    • 在旁注中,此方法(建立一个包含关闭的静态点)为您做的另一件事是保护您免受chdir 命令的影响。当其中一个出现在您的一个包含中时,它会烘焙您在它之后定义的所有相对路径。
    • 好的,我明白了。我还不清楚的是:如果我在 document_root 上拥有所有站点,define 会因为与使用$_SERVER['DOCUMENT_ROOT'] 相同而无用吗?如果是,我是否应该使用define,以便将来如果我需要更改某些内容,我只需更改define 上的定义?至少:每次我包含一个文件时,我都应该使用$_SERVER['DOCUMENT_ROOT'] 函数(或我为它设置的define)而不是相对路径?为什么我过去读到在更改服务器/等的情况下使用相对路径更好?
    • 该定义实际上实际上是多余的,但如果你仍然使用它,它会在未来轻松移动,并且在 php 方面应该使它只需要更改那一行代码.
    【解决方案2】:

    不,它们不一样。在这种情况下,相对路径基于启动包含链的文件的位置。使用__DIR__ 常量使路径相对于调用每个包含的文件:

    <?php
    // will evaluate to /WEB/mysite/htdocs/admin/flock/sql.php always
    require_once __DIR__ . '/flock/sql.php' or die("Error");
    ?>
    

    【讨论】:

    • 感谢您的回复。如果相对路径基于启动包含链的文件的位置,则此文件为scripttest.php:如果scripttest.php 位于/admin/edit/ 上且script1.php 位于/admin/ 上,则当script1.php 运行时require_once 'flock/sql.php',如果你写的相对路径是基于scripttest.php,它会调用'/admin/edit/flock/sql.php',但实际上它调用的是正确的路径'/admin/flock/sql.php',其中sql.php是!
    • No script1.php' is on /admin/` 这就是一切开始的地方。因此 script1.php 直接或间接包含的任何内容都将与该路径相关。因此,当 script1 导入flock/sql.php 时,如果script1.php 包含包含flock/sql.php 的scripttest.php,那么它将是/admin/flock/sql.php,那么它将再次引用相同的位置。
    • 但是scripttest.php 包括script1.phpscript2.php 所以路径从scripttest.php 开始?还是从第一个包含某些内容的脚本开始的所有路径??
    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2012-12-26
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多