包括来自父目录或其他目录的文件
Posted
技术标签:
【中文标题】包括来自父目录或其他目录的文件【英文标题】:Include files from parent or other directory 【发布时间】:2012-02-08 05:45:00 【问题描述】:我需要将父目录和其他子目录中的文件包含到子目录中。我以前通过简单地使用 include('/rootdirectory/file.php'); 来完成它。但现在它似乎不起作用了。
只是想知道我该怎么做,谢谢。
这是我的确切路线:
include('/forums/groups.php');
它给了我这个错误(页面仍然运行):
警告: include(/forums/groups.php) [function.include]: 失败 打开流:中没有这样的文件或目录 C:\xampp\htdocs\forums\blog\posts.php上线
警告: include() [function.include]:打开失败 '/forums/groups.php' 用于包含 (include_path='.;C:\xampp\php\PEAR') 在 C:\xampp\htdocs\forums\blog\posts.php 第 3 行
【问题讨论】:
经常遇到这个错误,要快速排除故障,请按照以下步骤操作:***.com/a/36577021/2873507 【参考方案1】:include()
及其亲属采用文件系统路径,而不是相对于文档根目录的 Web 路径。要获取父目录,请使用../
include('../somefilein_parent.php');
include('../../somefile_2levels_up.php');
如果您以/
开头,将使用绝对系统文件路径:
// Full absolute path...
include('/home/username/sites/project/include/config.php');
【讨论】:
试过这样做,但它对问题不起作用,因为我有同样的问题。 @ubique 如果它不能完全按照您的应用程序中发布的那样工作,那是因为您的文件系统布局可能与您的预期不同,而不是因为这是不正确的。发布有关您尝试包含的文件的信息以寻求帮助。 @ubique.. 或者您的脚本更改了当前工作目录。 getcwd() 看看它是什么。 @thanassis 你是指哪个根?文件系统根是'/'
,Web 服务器文档根是$_SERVER['DOCUMENT_ROOT'] . '/path/to.file.php'
(在某些主机上,文档根也是 FS 根,在许多其他主机上,它类似于 htdocs/ 目录)。要访问同级目录中的文件,您需要../sibling/file.php
@thanassis 在不知道您的文件系统布局的情况下,我无法猜测您失败的原因。具体来说,主文件驻留在哪个目录中,包含文件驻留在哪个目录中。当您的应用程序更改工作目录(Drupal 会这样做)时,这也可能是一个问题,然后您需要一个通过 dirname(__FILE__) . '/path/to/file.php'
的绝对路径,就像在其他解决方案中一样。【参考方案2】:
如果您的服务器没有使用
从父目录解析文件include '../somefilein_parent.php'
试试这个(使用相对于脚本的父目录):
include __DIR__ . "/../somefilein_parent.php";
【讨论】:
当我从代码文件夹中运行脚本时,从 linux ubuntu 命令行,第一种引用方式工作正常。但是,当我在当前目录为根目录或其他文件夹时运行脚本时.. 使用 php /var/www/html/mycode/myfile.php 运行时,包含文件没有采用正确的路径。因此,您使用 DIR 引用的第二种方式解决了该问题。【参考方案3】:这是我考虑到这个问题而写的:
<?
function absolute_include($file)
/*
$file is the file url relative to the root of your site.
Yourdomain.com/folder/file.inc would be passed as
"folder/file.inc"
*/
$folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");
if($folder_depth == false)
$folder_depth = 1;
include(str_repeat("../", $folder_depth - 1) . $file);
?>
希望对你有帮助。
【讨论】:
这看起来很有趣。如果您位于“主题”类型的子文件夹中,并且希望它成为您的绝对路径,那该怎么办?【参考方案4】:取决于您尝试包含的文件所在的位置。
例子:
/rootdir/pages/file.php
/someotherDir/index.php
如果您在 index.php 中编写了以下内容:
include('/rootdir/pages/file.php');
它会出错,因为它会尝试获取:
/someotherDir/rootdir/pages/file.php
哪个当然不存在……
所以你必须使用include('../rootdir/pages/file.php');
【讨论】:
我已经为这个常见错误开始了一个故障排除清单:***.com/a/36577021/2873507【参考方案5】:通俗地说,实用性,我认为这是一个古老的 DOS 技巧/东西。哇!那是什么?操作系统?没听说过!
".." 将您退出当前子目录一次到更高的文件夹/目录,并且 .. enter 键入两次也将您退出 2更高的父文件夹。继续背靠背添加“.. enter”,您很快就会发现自己位于目录的顶层。
对于新手要更好地理解这一点,请考虑这一点(如果您知道这意味着什么,请考虑家庭 PC 或“C:\ 驱动器”,而不是 web-servers/host“根目录”)。当您使用它时,请考虑您的网站存在于您家用 PC 的硬盘驱动器上的某个位置,隐藏在 C:\ 驱动器下的某个文件夹中。最后,你可以把它想象成“..”是后一个目录,“/”是前一个目录/文件夹。
现在! 如果您使用命令提示符并且位于 PC 的“myDocuments”文件夹中,则必须退出该文件夹以通过键入“../”。 如果您想访问位于 myDocuments 文件夹中的 widows 目录中的文件,理论上您可以键入 ../windows;在 DOS 命令提示符的现实中,您只需键入 ..,但我正在为您设置网络。 / 自然地重定向到另一个目录。
使用“myDocuments”假设您在其中创建了 2 个文件夹,分别称为“PHP1”和“PHP2”,这样我们现在就有了文件夹:
C:\myDocuments\PHP1 C:\myDocuments\PHP2在 PHP1 中放置一个名为 index.php 的文件。在 PHP2 文件夹中放置了一个名为 Found.php 的文件。现在变成:
C:\myDocuments\PHP1\index.php C:\myDocuments\PHP2\found.php在里面 C:\myDocuments\PHP1\index.php 文件,您需要编辑并键入如下内容:
<?php include ('../php2/found.php')?>
../ 是位置性的,因此它会考虑您当前的文件位置“C:\myDocuments\PHP1\index.php”,并且是一个指令告诉它退出 PHP1目录进入或前进到PHP2目录,查找Found.php文件。但它读了吗?请参阅下面我对故障排除的想法。
现在!假设您有 1 个文件夹 PHP1 和一个子文件夹 PHP2:
C:\myDocuments\PHP1\PHP2您只需引用/编码
<?php include('/PHP2/found.php') ?>
作为 PHP2 的子目录存在于 PHP1 目录之下或之内。
如果上述方法不起作用,则可能与 access/htaccess 或目录权限或拼写错误有关。为了增强这一点......进入故障排除......如果“found.php”文件中有错误/错别字,它会在呈现错误时崩溃,这可能是你的原因(require/require_once)体验它没有更改目录或访问文件的错觉。 最后想到这个问题,您可能需要实例化您的函数或引用,以便通过创建一个新的变量或对象(例如
$newObject = new nameobject("origianlThingy");
请记住,仅仅因为您包含/需要某些东西,有时意味着,它被包含/需要运行,但可能需要重新创建以使其处于活动状态或访问它。 New 肯定会“如果它可读”重新创建它的一个实例,并使其在当前文档中可用,同时保留原始文档。但是,您应该在所有实例中引用新创建的变量 $newObject ......如果它是全局的。
从一些网络主机帐户的角度来看;网络主机是一些超大的硬盘驱动器(就像您的 PC 上的那样),您的域只不过是他们分配给您的文件夹。您的文件夹称为根目录。在该文件夹中,您可以做任何您被允许做的事情。
您在目录/文件夹之间移动的“多种方法之一”是使用../
,但要多次退出当前参考到您想要的文件夹位置找到。
在我醉酒的状态下,我意识到我知道的太多以至于无法保持清醒,而不是 快疯了!”
【讨论】:
【参考方案6】:任何以斜杠开头的路径都是绝对路径。从服务器的根文件夹而不是文档根目录的根文件夹。您可以使用../
进入父目录。
【讨论】:
我已经为这个常见错误开始了一个故障排除清单:***.com/a/36577021/2873507【参考方案7】:我从 frank 那里获得灵感,并在我的“settings.php”文件中添加了类似的内容,当有链接时,该文件会包含在所有页面中:
“设置.php”
$folder_depth = substr_count($_SERVER["PHP_SELF"] , "/");
$slash="";
for ($i=1;$i<=($folder_depth-2);++$i)
$slash= $slash."../";
在我的 header.php 中要包含在所有页面中:
a href= .... php echo $slash.'index.php'....
似乎它适用于本地和托管环境......
(注意:我是一个绝对的初学者)
【讨论】:
【参考方案8】:之前有同样的问题是这样解决的:
include('/../includes/config.php'); //注意'/'出现在'../includes/config.php'之前
【讨论】:
【参考方案9】:您可能对使用 php 的内置函数 realpath() 感兴趣。 并传递一个常量 DIR
例如: $TargetDirectory = realpath(__DIR__."/../.."); //会带你回到2个文件夹
String realpath() :: 返回规范化的绝对路径名..
【讨论】:
这很完美!但请确保正确使用'/'斜线以使此方法有效。谢谢【参考方案10】:根目录(在 PHP 中)是被 ping 的文件的目录。例如,我去http://localhost/directory/to/file/index.php,根目录将是“/ditory/to/file”,因为它是您发出网络请求的那个。
【讨论】:
可以作为评论发表【参考方案11】:我不敢相信没有一个答案指向函数 dirname()
(自 PHP 4 起可用)。
基本上,它返回被引用对象的完整路径。如果您使用文件作为参考,该函数将返回文件的完整路径。如果引用的对象是一个文件夹,该函数将返回该文件夹的父文件夹。
https://www.php.net/manual/en/function.dirname.php
对于当前文件的当前文件夹,使用$current = dirname(__FILE__);
。
对于当前文件夹的父文件夹,只需使用$parent = dirname(__DIR__);
。
【讨论】:
以上是关于包括来自父目录或其他目录的文件的主要内容,如果未能解决你的问题,请参考以下文章
“致命:不是 git 存储库(或任何父目录)”来自 git status