路径混淆: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 在下面指出的那样,require
和 include
搜索 include_path.
【讨论】:
php 将搜索包含路径,所以这并不完全正确。但是,include-path 通常包含.
(当前目录),它是运行时的工作目录。在 Web 服务器上下文中,这被初始化为初始脚本的位置。请参阅:chdir
和 getcwd
。 fopen
不使用包含路径。
你说的完全正确;完全忘记了这一点。编辑了我的答案。【参考方案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 等是不是以相同的方式采用所有路径?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径