如何知道在PHP require_once()语句中使用的正确路径
我在web应用程序的根目录中有一个config.php文件,我想在几乎所有其他php文件中都包含该文件。因此,它们中的大多数都有这样一条线:如何知道在PHP require_once()语句中使用的正确路径,php,Php,我在web应用程序的根目录中有一个config.php文件,我想在几乎所有其他php文件中都包含该文件。因此,它们中的大多数都有这样一条线: require_once("config.php"); 或者有时候 require_once("../config.php"); 甚至 require_once("../../config.php"); 但我从来没有第一次做对。我看不出PHP在读取这些文件时会考虑什么是当前工作目录。显然,它不是包含require_once()调用的文件所在的目录,因
require_once("config.php");
或者有时候
require_once("../config.php");
甚至
require_once("../../config.php");
但我从来没有第一次做对。我看不出PHP在读取这些文件时会考虑什么是当前工作目录。显然,它不是包含require_once()调用的文件所在的目录,因为我可以在同一目录中有两个文件,它们的config.php路径不同
我是如何遇到这样一种情况的:一个路径可以刷新页面,但一个更新部分页面的ajax can需要require_once()语句中config.php的不同路径
秘密是什么?从何处评估该路径
很抱歉,我担心这不是一个常见的问题-这是在windows上运行的apache 2.2.8和PHP 5.2.6下发生的。我看到的唯一计算路径是您当前正在编辑的文件。我从来没有遇到过任何问题,但如果您遇到了问题,您可能希望提供更多信息(PHP版本、操作系统等)。我喜欢这样做:
require_once(dirname(__FILE__)."/../_include/header.inc");
这样,您的路径可以始终相对于当前文件位置。我使用目录名(\uuuu file\uuuuu
)
与大多数时候一样,但它可能需要一个基本入口点来加载所有其他代码,这些代码定义一个指向项目根的常量,即
define("ROOT",dirname(__FILE__).'/' );
然后,您需要知道的是路径相对于根的位置,即:
require(ROOT . "/lib/tool/error.php");
注意,
您应该真正避免路径的开头带有“./”,它们不是相对于文件的,而是相对于您所在的位置,这会产生错误的代码
cd foo
php bar/baz.php
-> some error saying it cant find the file
cd bar
php baz.php
-> suddenly working.
重要的
如果使用“./”符号,则需要完全忽略PHP包含路径,并且只考虑运行它的人在哪里 由于require和require_once与include和include_once非常相似,因此所有文档都从 首先查找要包含的文件 对于每个include_路径条目中的 相对于当前工作状态 目录,然后在目录中 当前脚本的名称。例如,如果您的 包含路径为库,当前 工作目录是/www/,您可以 包含include/a.php,并且有 在文件b.php中包含“b.php” 首先在/www/libraries/ 然后在/www/include/中。如果文件名 以./或../开头,看起来 仅在当前工作目录中
此外,通过从命令行执行“php-i”,可以找到所有当前的include路径。您可以在php.ini文件中编辑include路径,也可以通过ini_set()编辑。如果CLI不方便,您还可以在页面中运行php_info()函数,以获取环境变量的打印输出。查看函数getcwd 如果您有足够的访问权限,请尝试修改整个站点的PHP的
include_path
设置。如果无法做到这一点,则必须通过相同的PHP脚本(例如,使用Apache mod_rewrite)路由每个请求,或者必须使用设置include_路径的“初始化”脚本:
$includeDir = realpath(dirname(__FILE__) . '/include');
ini_set('include_path', $includeDir . PATH_SEPARATOR . ini_get('include_path'));
包含该文件后,请使用相对于包含目录的路径:
require_once '../init.php'; // The init-script
require_once 'MyFile.php'; // Includes /include/MyFile.php
PHP的当前工作目录是被调用脚本文件所在的目录。如果您的文件如下所示:
/A
foo.php
tar.php
B/
bar.php
如果调用foo.php(例如:),工作目录将是/A/。如果调用bar.php(例如:),工作目录将是/A/B/
这就是它变得棘手的地方。让我们假设foo.php是这样的:
<?php
require_once( 'B/bar.php' );
?>
或使用配置文件:
// config file
define( "APP_ROOT", realpath( dirname( __FILE__ ) ).'/' );
对于其余文件,请使用:
require_once( APP_ROOT.'../../path/to/file.php' );
原始GET或POST中请求的PHP文件的路径本质上就是该脚本的“工作目录”。任何“包含”或“必需”脚本也将继承该脚本作为其工作目录 我将在require语句中使用绝对路径,或者修改PHP的include_路径,以在我的应用程序中包含我可能希望用来保存额外键入的任何路径。您可以在php.ini中找到这一点 include_path=“.:/list/of/path/:/other/path/:/and/other/one” 我不知道在这个特殊的例子中它是否能帮到你,但是像FILE和DIR这样的神奇常量在你需要知道某个特定文件运行的路径时会很有用
我在每页的顶部都包含以下代码:
//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");
Include和require都采用相对路径或完全根路径。我更喜欢使用完整路径,并像上面的inlcude语句那样进行所有引用。这允许我输入一个通用变量$sitebasepath,该变量处理可能在不同机器之间更改的特定于帐户的信息,然后只需从webroot键入路径,即/globals/whatever_file.php
我还在表单中使用$self变量,这些表单可以调用它们自己来处理数据输入
希望这能有所帮助。那有点酷。所以require_once通常不会单独使用当前文件位置?我相信所有内容都与主PHP文件的路径有关。因此,如果在不同的目录中嵌套了include或requires,事情就会变得复杂起来。这可能就是我有这些问题的原因。@Bobwenholt你太棒了!我知道这是张贴近12年前,但我一直试图找到一个工作的解决方案,为这个问题的天。我真的非常感谢你的帮助!是的,config.php位于web应用程序的根目录中,所以我想说require_once(“/config.php”);但这似乎也不起作用。我希望每次都能这样。在我看来,这样做的问题是我有测试si
require_once( APP_ROOT.'../../path/to/file.php' );
//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");