您如何知道在PHP require_once()语句中使用的正确路径

时间:2008-11-05 21:12:13

标签: php

我在网络应用程序的根目录中有一个config.php文件,我想要包含在几乎所有其他php文件中。因此,他们中的大多数人都有如下行:

require_once("config.php");

或有时

require_once("../config.php");

甚至

require_once("../../config.php");

但是我第一次做对了。在读取其中一个文件时,我无法弄清楚php将会考虑当前的工作目录。它显然不是包含require_once()调用的文件的目录,因为我可以在同一目录中有两个文件,它们具有不同的config.php路径。

我如何在一个路径正确刷新页面的情况下,但ajax可以更新页面的一部分需要在require_once()语句中指向config.php的不同路径;

秘密是什么?该路径从哪里评估?

拍摄,我担心这不会是一个常见的问题 - 这是在Windows 2.2上运行的apache 2.2.8和PHP 5.2.6下发生的。

9 个答案:

答案 0 :(得分:23)

PHP的当前工作目录是被调用脚本文件所在的目录。如果您的文件如下所示:

/A
   foo.php
   tar.php
   B/
       bar.php

如果你打电话给foo.php(例如:http://example.com/foo.php),工作目录将是/ A /。如果你打电话给bar.php(例如:http://example.com/B/bar.php),工作目录将是/ A / B /.

有些地方变得棘手。让我们说foo.php是这样的:

<?php
require_once( 'B/bar.php' );
?>

bar.php是:

<?php
require_once( 'tar.php');
?>

如果我们调用foo.php,那么bar.php将成功调用tar.php,因为tar.php和foo.php在同一个目录中,恰好是工作目录。如果您改为调用bar.php,它将失败。

通常,您会在所有文件中看到:

require_once( realpath( dirname( __FILE__ ) ).'/../../path/to/file.php' );

或配置文件:

// config file
define( "APP_ROOT", realpath( dirname( __FILE__ ) ).'/' );

其余文件使用:

require_once( APP_ROOT.'../../path/to/file.php' );

答案 1 :(得分:8)

我喜欢这样做:

require_once(dirname(__FILE__)."/../_include/header.inc");

这样,您的路径始终可以相对于当前文件位置。

答案 2 :(得分:3)

我大多数时候都使用像bobwienholt这样的dirname(__FILE__)这样的东西,但它可以付出的代价是有一个基本入口点,它可以加载所有其他代码,这些代码定义了一个常量引用的根。该项目,即

__FILE__

然后你需要知道的是路径相对于root的位置,即:

define("ROOT",dirname(__FILE__).'/' ); 

注意,

你应该真的避免在它们的开头带有“../”的路径,它们不是相对于文件,而是相对于的地方,这会造成破坏 - 屁股代码。

require(ROOT . "/lib/tool/error.php"); 

重要

如果使用“../”符号,则完全忽略PHP包含路径,并且会考虑运行它的人员的位置。

答案 3 :(得分:2)

我将此代码包含在每个页面的顶部:

//get basic page variables
$self=$_SERVER['PHP_SELF']; 
$thispath=dirname($_SERVER['PHP_SELF']);
$sitebasepath=$_SERVER['DOCUMENT_ROOT'];

//include the global settings, variables and includes

include_once("$sitebasepath/globals/global.include.php");

包括并要求两者都采用相对路径或完全有根路径。我更喜欢使用完整路径并使我的所有引用像上面的inlcude语句一样。这允许我输入一个通用变量$ sitebasepath来处理可能在不同机器之间更改的帐户特定信息,然后只需从webroot键入路径,即。 /globals/whatever_file.php

我还在表单中使用$ self变量,可以调用自己来处理数据输入。

希望有所帮助。

答案 4 :(得分:1)

由于require和require_once与include和include_once非常相似,所有文档都发布在php.net上的“include”函数doc区域下面that page

  

首先查看包含文件   for for each include_path条目   相对于目前的工作   目录,然后在目录中   当前脚本例如。如果你的   include_path是库,current   工作目录是/ www /,你   包括include / a.php,还有   在该文件中包含“b.php”,b.php   首先看看/ www / libraries /   然后在/ www / include /。如果文件名   从./或../开始,看起来   仅在当前的工作目录中。

此外,您可以通过从命令行执行“php -i”来查找所有当前包含路径。您可以在php.ini文件中编辑包含路径,也可以通过ini_set()编辑。如果CLI不方便,您还可以在页面中运行php_info()函数以获取env变量的打印输出。

答案 5 :(得分:1)

如果您有足够的访问权限,请尝试修改整个站点的PHP include_path设置。如果你不能这样做,你要么必须通过相同的PHP脚本路由每个请求(例如使用Apache mod_rewrite),要么你必须使用设置include_path的“初始化”脚本:

$includeDir = realpath(dirname(__FILE__) . '/include'); 
ini_set('include_path', $includeDir . PATH_SEPARATOR . ini_get('include_path'));

包含该文件后,使用相对于include目录的路径:

require_once '../init.php'; // The init-script
require_once 'MyFile.php'; // Includes /include/MyFile.php

答案 6 :(得分:0)

我看过评估路径的唯一地方是您当前正在编辑的文件。我从来没有遇到任何问题,但如果你有,你可能想提供更多信息(PHP版本,操作系统等)。

答案 7 :(得分:0)

原始GET或POST中请求的PHP文件的路径本质上是该脚本的“工作目录”。任何“包含”或“必需”脚本也会将其作为工作目录继承。

我要么在require语句中使用绝对路径,要么修改PHP的include_path以包含我的应用程序中的任何路径,我可能想用它来节省额外的输入。你会在php.ini中找到它。

include_path =“。:/ list / of / paths /:/ another / path /:/ and / another / one”

我不知道它是否会在这个特定的例子中帮助你,但是如果你需要的话,像 FILE DIR 这样的神奇常数可以派上用场知道特定文件的运行路径。

http://us2.php.net/manual/en/language.constants.predefined.php

答案 8 :(得分:-1)

看看函数getcwd。 http://us2.php.net/getcwd