Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何知道在PHP require_once()语句中使用的正确路径_Php - Fatal编程技术网

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

如何知道在PHP require_once()语句中使用的正确路径,php,Php,我在web应用程序的根目录中有一个config.php文件,我想在几乎所有其他php文件中都包含该文件。因此,它们中的大多数都有这样一条线: require_once("config.php"); 或者有时候 require_once("../config.php"); 甚至 require_once("../../config.php"); 但我从来没有第一次做对。我看不出PHP在读取这些文件时会考虑什么是当前工作目录。显然,它不是包含require_once()调用的文件所在的目录,因

我在web应用程序的根目录中有一个config.php文件,我想在几乎所有其他php文件中都包含该文件。因此,它们中的大多数都有这样一条线:

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”

我不知道在这个特殊的例子中它是否能帮到你,但是像FILEDIR这样的神奇常量在你需要知道某个特定文件运行的路径时会很有用


我在每页的顶部都包含以下代码:

//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");