路径混淆:require、include、fopen 等是不是以相同的方式采用所有路径?

Posted

技术标签:

【中文标题】路径混淆:require、include、fopen 等是不是以相同的方式采用所有路径?【英文标题】:Path Confusion: Does require, include, fopen etc. take all their paths the same way?路径混淆:require、include、fopen 等是否以相同的方式采用所有路径? 【发布时间】:2010-12-30 07:22:06 【问题描述】:

我稍微记得从古老的 php 时代(几年前)开始,不同的函数希望有不同的路径。我的意思是……从不同的角度开始。有些是相对的,有些是绝对的,等等。

fopen 怎么样?这和require一样吗?相同情况下相同路径?

【问题讨论】:

【参考方案1】:

路径总是相对于初始脚本的位置,即使解析器正在处理驻留在不同目录中的包含。

要可靠地使用相对于当前文件的路径,请使用

dirname(__FILE__)

或在 PHP 5 中

__DIR__

此外,正如@troelskn 在下面指出的那样,requireinclude 搜索 include_path.

【讨论】:

php 将搜索包含路径,所以这并不完全正确。但是,include-path 通常包含.(当前目录),它是运行时的工作目录。在 Web 服务器上下文中,这被初始化为初始脚本的位置。请参阅:chdirgetcwdfopen 不使用包含路径。 你说的完全正确;完全忘记了这一点。编辑了我的答案。【参考方案2】:

include 和 require 将首先查找与 php.ini 中给定设置相关的文件。

假设您的 ini 文件的包含路径条目是:

include_path = "var/www/includes;/var/www/PEAR"

然后在您的脚本中,无论在您的文档树中的哪个位置,例如

/var/www/html/website1/miles/down/in/folders/index.php

你只是为了包含一个文件:

包括“settings.php”;

只要 settings.php 是 include_path 文件夹之一,它就会被包含,那么你就不用担心相对/绝对路径关系了。

如果您愿意,也可以使用 ini_set() 在 .htaccess 文件和每个文件中更改此设置。

更多信息: http://php.net/manual/en/function.set-include-path.php http://www.modwest.com/help/kb.phtml?cat=5&qid=98

或谷歌搜索“include_path php”

【讨论】:

【参考方案3】:

Arg 我想发表评论,但我不能...

@troelskn:

当您使用 dirname(__ FILE __) 时,包含不会解析为包含路径,因为您提供的是包含的绝对路径。仅当您不提供任何路径,只提供文件名时才会搜索包含路径(不适用于绝对或相对路径)。

如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,或在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 . 或 .. 开头)——include_path 都将被忽略完全一致。

http://php.net/manual/en/function.include.php

【讨论】:

【参考方案4】:

这个问题已经很老了,但围绕这个问题仍然存在一些混淆。在某些方面,具有不同相对路径的不同功能仍然存在。例如,以下可能无法按预期工作:

if(is_file($target))
    include $target;

is_file, is_dir, fopen - 将使用相对于 HTTP 请求请求的文件的路径,不受 set_include_path() 的影响

include,require - 可能有一个不同的路径分配给 set_include_path()

所以更正确的是上面的代码应该是这样的:

if(is_file(get_include_path().'/'.$target))
    include $target;

【讨论】:

以上是关于路径混淆:require、include、fopen 等是不是以相同的方式采用所有路径?的主要内容,如果未能解决你的问题,请参考以下文章

require或include相对路径多层嵌套引发的问题

PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径

php requirerequire_once和includeinclude_once的区别

PHP require_once 错误与相对路径

php require() 不适用于相对或完整

js代码反混淆之ast的使用