我在网络应用程序的根目录中有一个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下发生的。
答案 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