PHP绝对路径的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP绝对路径的问题相关的知识,希望对你有一定的参考价值。
怎样把一个相对路径转换成绝对路径?
比如在ASP里只需要
Server.MapPath("../data/byle.mdb")
在php里呢?
<?php
$filename = "/Images/UserImages/1.jpg";
echo $filename;
echo realpath($filename);
?>
这样只显示了一个 $filename;
就是 /Images/UserImages/1.jpg
引言:
关于PERL与PHP中的包含路径一直是一个比较难解的问题,主要是与操作系统和WEB服务器有关,不可能非常智能化的解决这个路径问题。相对于PERL,PHP的路径好得多,解决起来也容易得多,因为PHP的相对路径在PHP程序中的任何场合都可以使用,而不象PERL在某些语句中必须用绝对路径而导致移植的极其复杂。
基于此,在PHP中,我设计了一个绝对稳妥的解决方案,如下所述。
原则:
使用相对路径,但在相对路径中用绝对路径(有点绕,待会儿详解),一是可以保证可移植性,二是可以方便地修改,三是公式化且结构清晰明了,易于扩展。
步骤详解:
1、先确定好一个程序的根目录,注意是文件系统下的,不是WEB服务器下的虚拟目录,不过一般情况下该目录下的子目录的相对路径与URL下该目录的虚拟子目录是相同的。
2、在定义好的程序根目录下的每个子目录下(其实不一定是每个,根据需要)建立一个settings.php,里面定义一个变量或是常数(常数比较好,因为作用域比较大),如APPROOT,但这个APPROOT却不是绝对路径,而是该目录相对于你指定的程序根目录的相对路径。
3、在此目录下的所有程序入口文件(也即第一个包含其它文件的文件,或是允许直接在浏览器中浏览的文件)中第一句写上require_once('settings.php');,但要注意,所有被包含文件最好不要加此句——其实加上也可以,因为你可以在settings.php中写上 if(!defined(APPROOT)) define(APPROOT, '../..');这类的语句以防重定义。
4、如果你要包含其它文件,无论是直接还是间接地包含,都可以写成 include(APPROOT.$path);,这里$path为被包含文件相对于你所指定的程序根目录的绝对路径。
原理:
定下的程序根目录是相对路径,但具体的目录位置是相对于那个根目录的绝对路径,两者组合起来就是具体文件相对于程序根目录的相对路径了。例如目录c:\wwwroot\app为你指定的程序根目录,然后有这么两个文件c:\wwwroot\app\a\index.php和c:\wwwroot\app\b\inc.php。对子目录a来说,APPROOT是'..',而对程序根目录来说,inc.php的绝对路径是$path='/b/inc.php',两者组合为'../b/inc.php'。如果要在index.php中包含inc.php就要写成include('../b/inc.php');,而这个路径不就正好是刚才组合而成的APPROOT.$path吗?
结论:
经过以上处理,各个路径绝对整齐划一,唯一罗嗦一点的就是每个目录下要定义一下这个APPROOT,但每个目录下只需在本目录的settings.php中定义一次就足够了。如果你整个程序只有一个入口文件,如index.php,而其它文件全部都是直接或是间接地被包含进这个唯一的入口文件的话,就只需在index.php的所在目录下的settings.php中定义一次就OK了。如果有朋友做过Delphi的工程并对工程文件研究过的话,就会发现我刚才说的一个程序只有一个主入口文件的情况与Delphi的工程十分相似,因为Delphi除了一个主程序文件(dpr文件),其余的全部是单元文件或是资源文件,都不能独立执行。在PHP中,如果这种情况出现,只需定义一次APPROOT,并在主程序文件中第一句话写成require_once('settings.php');,而以后所有的包含全都可以用include(APPROOT.$path);,就保证不会有任何问题,除非你不会写这个“包含文件相对于程序根目录的绝对路径”$path。
这个方法我用了不止一次,收效很好。另外还可以参考JSP的WEB-INFO中路径的定义方式。
我这个是以不变应万变的公式化的方案,如果有朋友有更好的方案,欢迎提出讨论!如有不明白的也欢迎提出。 参考技术A 推荐用这种方式表示
./Images/UserImages/1.jpg
./代表站点根目录 参考技术B 先用 $_SERVER['DOCUMENT_ROOT']这个系统变量来获得根,然后再连接你的/Images/UserImages/1.jpg,就是绝对路径了
PHP:从绝对 URL 获取绝对路径
【中文标题】PHP:从绝对 URL 获取绝对路径【英文标题】:PHP: Get absolute path from absolute URL 【发布时间】:2012-08-27 21:22:00 【问题描述】:我有一个文件的绝对路径,有没有办法获取文件的绝对路径
http://domainname/rootfolder/filename.php
我想得到类似的东西
/home/domainname/public_html/foldername/filename.php
【问题讨论】:
您确定没有混淆示例中的rootfolder
和foldername
?
你怎么能同时拥有和没有绝对路径?您应该检查 dirname()、realpath() 函数和 FILE 常量...
dirname() 和 realpath 要求脚本和路径应该在同一台服务器上,但我在不同的服务器上
zerkms,它们是同一个东西,我的意思是文件夹名或目录名
【参考方案1】:
我发现它可以可靠地工作:
function get_file_path_from_url( $file_url )
return realpath($_SERVER['DOCUMENT_ROOT'] . parse_url( $file_url, PHP_URL_PATH ));
【讨论】:
【参考方案2】:试试
$filepath = $_SERVER['DOCUMENT_ROOT'].'/rootfolder/filename.php'
这可能会对你有所帮助。
【讨论】:
【参考方案3】:这是最简单的方法:
$path = parse_url('http://domainname/rootfolder/filename.php', PHP_URL_PATH);
//To get the dir, use: dirname($path)
echo $_SERVER['DOCUMENT_ROOT'] . $path;
这会打印出完整的路径。
文档:
parse_url
DOCUMENT_ROOT
dirname
【讨论】:
这不适用于 user_dir 路径,其中 /~user/... 映射到用户主目录中的某些内容。在这种情况下,您必须使用$_SERVER['CONTEXT_DOCUMENT_ROOT']
并从网址中删除~user
部分。【参考方案4】:
您可以使用the parse_url
function 获取网址的本地部分。
然后将其转换为文件路径需要您知道网络服务器的文档根目录在哪里。如果它与运行页面的服务器是同一台服务器,那么您通常可以从$_SERVER['DOCUMENT_ROOT']
获取。
这还取决于没有什么可以阻止 URL 不直接映射到文件系统(例如 mod_rewrite、mod_alias、通过 MVC 框架路由的 URI 等)。例如,对于我目前正在开发的系统,如果您要点击 http://example.com/blog/2012/01/01/,那么所涉及的文件将是 /home/user/recall/script/recall.psgi 和 /home/user/recall/root/blog/day.tt 但 DocumentRoot 将是 /home /user/recall/htdocs/)
【讨论】:
我的脚本在不同的服务器上,路径不同 那么您需要知道该服务器是如何配置的,然后才能计算 URI 解析到其文件系统的哪个位置。【参考方案5】:试试$_SERVER['DOCUMENT_ROOT']
。假设一个 URL 像
http://example.com/subfolder/somefile.html
文件在服务器上的实际位置
/home/sites/example.com/html/subfolder/somefile.html
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- $_SERVER['DOCUMENT_ROOT']
【讨论】:
我的脚本在不同的服务器上,路径不同 那么你需要知道那个文档根是什么。此类数据不会由标准 http 请求显示。以上是关于PHP绝对路径的问题的主要内容,如果未能解决你的问题,请参考以下文章