admin 管理员组文章数量: 1086019
2024年3月6日发(作者:留言板html代码)
推荐用这种方式表示
./Images/UserImages/
./代表站点根目录
Php路径问题及其解决方法
PHP相关, 原创 05月 20th, 2008
初学PHP的时候,我们经常被PHP的绝对路径和相对路径弄的晕头转向。路径问题经常导致include及 require命令不能加载到指定的页面,从而导致Web程序运行错误。本文将跟大家一起探讨一下PHP路径问题的常用解决方案。
下面我们先做一个个简单的示例:
上图是一个简单Web项目的结构图,其中各文件的代码如下:
root/ :
require_once ‘app/’;
$blog=new Blog();
echo $blog->GetBlogInfo();
?>
root/app/ :
require_once ‘../lib/smarty/’;
?>
class Blog
{
public function GetBlogInfo()
{
return ‘This is a test of blog!’;
}
}
?>
echo ‘root/app/ loaded successed!’;
?>
首先,我们从浏览器里直接输入localhost/root/app/, 浏览器显示:
———————————————————————-
root/app/ loaded successed!
———————————————————————-
文件加载成功,没发生任何警告或错误。
接下来,我们在浏览器中请求如下网站:localhost/root/, 浏览器显示出如下错误信息:
———————————————————————————
Warning: require_once(../lib/smarty/)
[e-once]: failed to open stream: No such file or directory
in T:StudyPHP_ on line 2
Fatal error: require_once() [e]: Failed opening required
‘../lib/smarty/’ (include_path=’.;C:php5pear’) in
T:StudyPHP_ on line 2
———————————————————————————
为什么’../lib/smarty/’没能加载? 我们访问localhost/root/app/没有出现任何异常,这说明出现错误的原因很可能在root/的require_once ‘app/’语 句。从Google里搜索一下:php路径问题,你就能找到问题的答案。当root/引用root/app/后,中的require_once语句的参照点变成了root/所 在的目录(根目录root)。所以,以root/为 参照点加载‘../lib/smarty/’时,自然就出错了。
找到了问题所在,接下来,我们就来寻找解决问题的办法:
1.将所有文件放在一个文件夹下
将所有文件放在一个文件夹下,那么就不会存在路径问题了。但是,这绝对是个馊主意!!除非你写一个小的不能再小的项目,不然请不要尝试这种方法,没有结构 的系统太可怕了!
2.使用绝对路径
注:PHP中的include和require使用的是 文件系统的绝对路径,如“c:”
step1:刚刚发生异常是因为我们使用了相对路径,如果换成绝对路径就不会出现以上错误。让我们简单修改一下root/app/:
将前三行由
require_once ‘../lib/smarty/’;
?>
修改为:
require_once
‘T:StudyPHP_’;
?>
现在,我们访问:localhost/root/ ,浏览器显示:
—————————————-
root/app/ loaded successed!
This is a test of blog!
—————————————-
程序执行成功了。
step2:虽然程序不报错了,但很明显,我们并没有真正的解决问题。没有人会在程序 里写require_once ‘T:StudyPHP_RELProjects„’这样的东西,这样写将会使程序完全丧失灵活性,使程 序难以移植!
让我们再重新回想一下出现错误的原因:1.不同层次文件之间的引用使require_once的参 照点发生了变化;2.参照点发生变化后,按相对路径加载文件会出错。如果我们把require_once的参照点固定,问题不就解决了吗.如何固定参照点?当然是使用绝对路径,具体实现方 法:一个函数+一个常量:dirname()和__FILE__。让我们重新修改root/app/如 下:
将前三行由
require_once
‘T:StudyPHP_’;
?>
修改为:
require_once dirname(__FILE__).‘/’.‘../lib/smarty/’;
?>
再次访问localhost/root/程序运行正常,但这种解 决方式很明显优于step1中的解决方式。应该说,这是一种"绝对路径+相对路 径"的解决方式。
step3:上面的方法已经能够解决路径问题,但感觉代码不够优雅。让代码更优雅,我们可以这样做:在根目录 (root)下新建一个:
root/ :
if(!defined(ABSPATH))
define(‘ABSPATH’,dirname(__FILE__).‘/’);
?>
root/app/中的 代码修改为:
require_once ABSPATH.‘lib/smarty/’;
?>
同时root/中的代码修改为:
require_once ’’;
require_once ABSPATH.‘app/’;
$blog=new Blog();
echo $blog->GetBlogInfo();
?>
仔细考虑一下,如果直接访问localhost/root/app/又 会出现问题:常量ABSPATH没有定义。所以,如果你的程序有直接访问localhost/root/app/这 种情况类似的情况,那么最好直接使用dirname(__FILE__).‘/’.‘相对路径’,或者在使用ABSPATH前加一个判断(但这样有点脱裤子放X的感觉)。
注:在WordPress中 使用了ABSPATH与dirname(__FILE__).‘/’.‘相对路径’相结合的方法,从网站统一入口(根目录 /)加载的文件,使用ABSPATH的解决方法(ABSPATH在根目录/
中定义),而那些不直接通过统一入口访问的php文 件,WP使用dirname(__FILE__).‘/’.‘相对路径’的解决方案。
3.设置Apache的include_path参数
在前面的错误信息中,有一句值得我们注意:
———————————————
Fatal error: require_once() [e]: Failed opening required
‘../lib/smarty/’ (include_path=’.;C:php5pear’) in
T:StudyPHP_ on line 2
———————————————
Apache的include_path参数保存的是require/include的读取目录,在上面的错误信息里,include_path包含了两 个位置:
1) "."表示从当前文件所在的目录中加载
2) "C:php5pear"表示从C盘的php5/pear目录下加载。
php函数库为我们提供了set_include_path()函数用于设置include_path参数。通过set_include_path()函 数,我们可以自定义加载位置(ZendFramework中就是使用 set_include_path()函数来解决路径问题)。
下面我们来演示一下如何用set_include_path()函数:
root/ :
set_include_path(‘./’.PATH_e(__FILE__));
require_once ‘app/’;
$blog = new Blog();
echo $blog->GetBlogInfo();
?>
root/app/ ;
require_once ‘lib/smarty/’;
?>
class Blog
{
public function GetBlogInfo()
{
return ‘This is a test of blog!’;
}
}
?>
echo ‘root/app/ loaded successed!
’;
?>
测试localhost/root/,运行正常。从root/app/可以看出,require_once的 路径写法更简洁了(不需要使用ABSPATH或者dirname(__FILE__))。这种实现方式跟ABSPATH的解决方式一样,需要保证系统有统 一的入口点(一般通过.htaccess文件实 现)。
当然,解决php路径的方法不止以上几种,网上有很多人提供了针对php路径问题的解决方案,但多数都有一定的适用场景,不能生搬硬套。在下一篇日 志中,我会对php路径问题的其他解决方法做一个简单的总结。
版权声明:本文标题:关于php中的路径 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1709677061a543271.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论