《关于php中的路径》由会员分享,可在线阅读,更多相关《关于php中的路径(6页珍藏版)》请在金锄头文库上搜索。
1、推荐用这种方式表示 ./Images/UserImages/1.jpg./代表站点根目录 PhpPhp 路径问题及其解决方法路径问题及其解决方法PHP 相关, 原创 05 月 20th, 2008 初学 PHP 的时候,我们经常被 PHP 的绝对路径和相对路径弄的晕头转向。路径 问题经常导致 include 及 require 命令不能加载到指定的页面,从而导致 Web 程序运行错误。本文将跟大家一起探讨一下 PHP 路径问题的常用解决方案。 下面我们先做一个个简单的示例:上图是一个简单 Web 项目的结构图,其中各文件的代码如下: root/index.phproot/index.php :
2、 : GetBlogInfo(); ?root/app/blog.phproot/app/blog.php : : ; ?首先,我们从浏览器里直接输入 http:/localhost/root/app/blog.php, 浏览 器显示:-root/app/blog.php loaded successed!-文件加载成功,没发生任何警告或错误。接下来,我们在浏览器中请求如下网站:http:/localhost/root/index.php, 浏览器显示出如下错误信息: Warning: require_once(./lib/smarty/functions.php) function.requ
3、ire- once: failed to open stream: No such file or directory in T:StudyPHP_RELProjectsrootappblog.php on line 2 Fatal error: require_once() function.require: Failed opening required ./lib/smarty/functions.php (include_path=.;C:php5pear) in T:StudyPHP_RELProjectsrootappblog.php on line 2 为什么./lib/smar
4、ty/functions.php没能加载? 我们访问 http:/localhost/root/app/blog.php 没有出现任何异常,这说明出现错误的 原因很可能在 root/index.phproot/index.php 的 require_once app/blog.php语 句。从 Google 里搜索一下:phpphp 路径问题路径问题,你就能找到问题的答案。当 root/index.phproot/index.php 引用 root/app/blog.phproot/app/blog.php 后,blog.php 中的 require_once 语 句的参照点变成了 root/
5、index.phproot/index.php 所 在的目录(根目录 root)。所以,以 root/index.phproot/index.php 为 参照点加载./lib/smarty/functions.php时,自然就 出错了。找到了问题所在,接下来,我们就来寻找解决问题的办法:1.将所有文件放在一个文件夹下将所有文件放在一个文件夹下,那么就不会存在路径问题了。但是,这绝对是个 馊主意!除非你写一个小的不能再小的项目,不然请不要尝试这种方法,没 有结构 的系统太可怕了!2.使用绝对路径注:注:PHP 中的 include 和 require 使用的是 文件系统的绝对路径,如 “c:ww
6、wrootyourprojectindex.php”step1:刚刚发生异常是因为我们使用了相对路径,如果换成绝对路径就不会出 现以上错误。让我们简单修改一下 root/app/blog.phproot/app/blog.php: 将前三行由 修改为: 现在,我们访问:http:/localhost/root/index.php ,浏览器显示:- root/app/blog.php loaded successed! This is a test of blog! -程序执行成功了。step2:虽然程序不报错了,但很明显,我们并没有真正的解决问题。没有人会 在程序 里写 require_onc
7、e T:StudyPHP_RELProjectsfunctions.php 这样的东西,这样写将会使程序完全丧失灵活性,使程 序难以移植!让我们再重新回想一下出现错误的原因:1.不同层次文件之间的引用使 require_once 的参参 照点照点发生了变化;2.参照点发生变化后,按相对路径相对路径加载文 件会出错。如果我们把 require_once 的参照点固定,问题不就解决了吗.如何固 定参照点?当然是使用绝对路径,具体实现方 法:一个函数+一个常量:dirname()和_FILE_。让我们重新修改 root/app/blog.phproot/app/blog.php 如 下: 将前三行由
8、 修改为: 再次访问 http:/localhost/root/index.php 程序运行正常,但这种解 决方式 很明显优于 step1 中的解决方式。应该说,这是一种“ “绝对路径绝对路径+ +相对路相对路 径径“ “的解 决方式。step3:上面的方法已经能够解决路径问题,但感觉代码不够优雅。让代码更优 雅,我们可以这样做:在根目录 (root)下新建一个 settings.php:settings.php: root/settings.phproot/settings.php : : root/app/blog.phproot/app/blog.php 中的 代码修改为:同时 root
9、/index.phproot/index.php 中的代码修改为:GetBlogInfo(); ?仔细考虑一下,如果直接访问 http:/localhost/root/app/blog.php 又 会出现 问题:常量 ABSPATH 没有定义。所以,如果你的程序有直接访问 http:/localhost/root/app/blog.php 这 种情况类似的情况,那么最好直接 使用 dirname(_FILE_)./.相对路径,或者在使用 ABSPATH 前加一个 判断(但这样有点脱裤子放的感觉)。注注:在 WordPress 中 使用了 ABSPATH 与 dirname(_FILE_)./.
10、相对路 径相结合的方法,从网站统一入口(根目录根目录 /index.php/index.php)加载的文件,使用 ABSPATH 的解决方法(ABSPATH 在根目录/wp-config-sample.php 中定义),而那 些不直接通过统一入口访问的 php 文 件,WP 使用 dirname(_FILE_)./. 相对路径的解决方案。3.设置 Apache 的 include_path 参数在前面的错误信息中,有一句值得我们注意: Fatal error: require_once() function.require: Failed opening required ./lib/smar
11、ty/functions.php (include_path=.;C:php5pear)(include_path=.;C:php5pear) in T:StudyPHP_RELProjectsrootappblog.php on line 2 Apache 的 include_path 参数保存的是 require/include 的读取目录,在上面的 错误信息里,include_path 包含了两 个位置: 1) “.“表示从当前文件所在的目录中加载 2) “C:php5pear“表示从 C 盘的 php5/pear 目录下加载。 php 函数库为我们提供了 set_include_pat
12、h()函数用于设置 include_path 参数。 通过 set_include_path()函 数,我们可以自定义加载位置(ZendFramework 中 就是使用 set_include_path()函数来解决路径问题)。下面我们来演示一下如何用 set_include_path()函数:root/index.phproot/index.php : :GetBlogInfo(); ?root/app/blog.php ; ? 测试 http:/localhost/root/index.php,运行正常。从 root/app/blog.phproot/app/blog.php 可 以看出,require_once 的 路径写法更简洁了(不需要使用 ABSPATH 或者 dirname(_FILE_))。这种实现方式跟 ABSPATH 的解决方式一样,需要保证系 统有统 一的入口点(一般通过.htaccess 文件实 现)。当然,解决 php 路径的方法不止以上几种,网上有很多人提供了针对 php 路径 问题的解决方案,但多数都有一定的适用场景,不能生搬硬套。在下一篇日 志 中,我会对 php 路径问题的其他解决方法做一个简单的总结。