`

Php路径问题及其解决方法

    博客分类:
  • PHP
阅读更多

Php路径问题及其解决方法­

PHP相关, 原创 05月 20th, 2008 ­

初学PHP的时候,我们经常被PHP的绝对路径和相对路径弄的晕头转向。路径问题经常导致include及require命令不能加载到指定的页面,从而导致Web程序运行错误。本文将跟大家一起探讨一下PHP路径问题的常用解决方案。­

下面我们先做一个个简单的示例:­

图片 ­

上图是一个简单Web项目的结构图,其中各文件的代码如下: ­

root/index.php : ­

<?php ­

require_once ‘app/blog.php’;­

­

$blog=new Blog();­

echo $blog->GetBlogInfo();­

?>­

root/app/blog.php :[/B] ­

<?php ­

require_once ‘../lib/smarty/functions.php’;­

?> ­

<?php ­

class Blog­

{ ­

   public function GetBlogInfo()­

   {­

     return ‘This is a test of blog!’;­

   }­

} ­

?> ­

<?php ­

echo ‘root/app/blog.php loaded successed!</br>’; ­

?>­

首先,我们从浏览器里直接输入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.require-once]: failed to open stream: No such file or directory in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2­

Fatal error: require_once() [function.require]: Failed opening required ‘../lib/smarty/functions.php’ (include_path=’.;C:\php5\pear’) in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2­

———————————————————————————­

为什么’../lib/smarty/functions.php’没能加载? 我们访问http://localhost/root/app/blog.php没有出现任何异常,这说明出现错误的原因很可能在root/index.php的require_once ‘app/blog.php’语句。从Google里搜索一下:php路径问题[/B],你就能找到问题的答案。当root/index.php引用root/app/blog.php后,blog.php中的require_once语句的参照点变成了root/index.php[/B]所在的目录(根目录root)。所以,以root/index.php为参照点加载‘../lib/smarty/functions.php’时,自然就出错了。­

找到了问题所在,接下来,我们就来寻找解决问题的办法:­

1.将所有文件放在一个文件夹下­

将所有文件放在一个文件夹下,那么就不会存在路径问题了。但是,这绝对是个馊主意!!除非你写一个小的不能再小的项目,不然请不要尝试这种方法,没有结构的系统太可怕了!­

2.使用绝对路径­

注:PHP中的include和require使用的是文件系统的绝对路径,如“c:\wwwroot\yourproject\index.php”­

­

step1:刚刚发生异常是因为我们使用了相对路径,如果换成绝对路径就不会出现以上错误。让我们简单修改一下root/app/blog.php:­

将前三行由 ­

<?php ­

require_once ‘../lib/smarty/functions.php’;­

?>­

­

修改为: ­

<?php ­

require_once ‘T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php’;­

?> ­

现在,我们访问:http://localhost/root/index.php ,浏览器显示:­

—————————————-­

root/app/blog.php loaded successed!­

This is a test of blog!­

—————————————-­

程序执行成功了。­

step2:虽然程序不报错了,但很明显,我们并没有真正的解决问题。没有人会在程序里写require_once ‘T:\Study\PHP_REL\Projects…functions.php’这样的东西,这样写将会使程序完全丧失灵活性,使程序难以移植!­

让我们再重新回想一下出现错误的原因:1.不同层次文件之间的引用使require_once的参照点发生了变化;2.参照点发生变化后,按相对路径加载文件会出错。如果我们把require_once的参照点固定,问题不就解决了吗.如何固定参照点?当然是使用绝对路径,具体实现方法:一个函数+一个常量:dirname()和__FILE__。让我们重新修改root/app/blog.php如下:­

将前三行由 ­

<?php ­

require_once ‘T:\\Study\\PHP_REL\\Projects\\root\\lib\\smarty\\functions.php’; ­

?> ­

修改为: ­

<?php ­

require_once dirname(__FILE__).‘/’.‘../lib/smarty/functions.php’; ­

?>­

再次访问http://localhost/root/index.php程序运行正常,但这种解决方式很明显优于step1中的解决方式。应该说,这是一种"绝对路径+相对路径"的解决方式。­

­

step3:上面的方法已经能够解决路径问题,但感觉代码不够优雅。让代码更优雅,我们可以这样做:在根目录(root)下新建一个settings.php: ­

图片 ­

root/settings.php :[/B] ­

<?php ­

if(!defined(ABSPATH)) ­

define(‘ABSPATH’,dirname(__FILE__).‘/’);­

?> ­

root/app/blog.php中的代码修改为:­

<?php ­

require_once ABSPATH.‘lib/smarty/functions.php’; ­

?> ­

同时root/index.php中的代码修改为:­

­

<?php­

require_once ’settings.php’; ­

require_once ABSPATH.‘app/blog.php’;­

­

$blog=new Blog();­

echo $blog->GetBlogInfo();­

?>­

仔细考虑一下,如果直接访问http://localhost/root/app/blog.php又会出现问题:常量ABSPATH没有定义。所以,如果你的程序有直接访问http://localhost/root/app/blog.php这种情况类似的情况,那么最好直接使用dirname(__FILE__).‘/’.‘相对路径’,或者在使用ABSPATH前加一个判断(但这样有点脱裤子放X的感觉)。­

:在WordPress中使用了ABSPATH与dirname(__FILE__).‘/’.‘相对路径’相结合的方法,从网站统一入口(根目录/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/smarty/functions.php’ (include_path=’.;C:\php5\pear’) in T:\Study\PHP_REL\Projects\root\app\blog.php on line 2­

———————————————­

Apache的include_path参数保存的是require/include的读取目录,在上面的错误信息里,include_path包含了两个位置:­

1) "."表示从当前文件所在的目录中加载­

2) "C:\php5\pear"表示从C盘的php5/pear目录下加载。­

php函数库为我们提供了set_include_path()函数用于设置include_path参数。通过set_include_path()函数,我们可以自定义加载位置(ZendFramework中就是使用set_include_path()函数来解决路径问题)。­

下面我们来演示一下如何用set_include_path()函数:­

root/index.php :­

<?php­

set_include_path(‘./’.PATH_SEPARATOR.dirname(__FILE__)); ­

require_once ‘app/blog.php’;­

$blog = new Blog();­

echo $blog->GetBlogInfo();­

?>­

root/app/blog.php ;­

<?php­

require_once ‘lib/smarty/functions.php’;­

?>­

<?php­

class Blog­

  public function GetBlogInfo()­

  {­

    return ‘This is a test of blog!’;­

  }­

?>­

<?php­

echo ‘root/app/blog.php loaded successed!<br/>’;­

?> ­

测试http://localhost/root/index.php,运行正常。从root/app/blog.php可以看出,require_once的路径写法更简洁了(不需要使用ABSPATH或者dirname(__FILE__))。这种实现方式跟ABSPATH的解决方式一样,需要保证系统有统一的入口点(一般通过.htaccess文件实现)。­

当然,解决php路径的方法不止以上几种,网上有很多人提供了针对php路径问题的解决方案,但多数都有一定的适用场景,不能生搬硬套。在下一篇日志中,我会对php路径问题的其他解决方法做一个简单的总结。­

 

­

分享到:
评论

相关推荐

    kindeditor图片上传后生成带域名绝对路径配置及提交空格无法保存解决方法

    kindeditor图片上传后生成带域名绝对路径配置及提交空格无法保存解决方法。

    PHP实现的迪科斯彻(Dijkstra)最短路径算法实例

    一、待解决问题 单源最短路径问题,在给定有向图中求一个顶点(单源顶点)到其他所有顶点的最短路径问题。在下图中,每条边上有一个权值,希望求解A到所有其他顶点(B/C/D/E/F/G)的最短路径。 二、问题分析(最短...

    php连接Access数据库错误及解决方法

    推荐的代码需要注意php获取路径用的是realpath 复制代码 代码如下: &lt;?php $connstr=”DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=” . realpath(“data.mdb”); $connid=odbc_connect($connstr,””,””,...

    解决php扩展安装不生效问题

    php安装扩展模块后,重启不生效的原因及解决办法 在lnmp运维环境中,我们经常会碰到有些php依赖的扩展模块没有安装,这就需要后续添加这些扩展模块。在扩展被安装配置后,往往会发现php-fpm服务重启后,这些扩展并...

    dvwa+xampp搭建显示乱码的问题及解决方案

    由于安装路径不同,但是相对路径(即dvwa的安放路径)DVWA\dvwa\includes\dvwaPage.inc.php是不变的 修改里面的http头:把默认的编码utf-8修改为gb2312,这样每次显示就正常了 在XAMPP本地环境中安装SHOPEX出现乱码...

    phpStudy 2016.10.31 再次更新,支持自定义php版本

    所以下载phpStudy之后切换到php5.2即可解决问题。 需要Zend Guard Loader的切换到php5.3和php5.4,但是必须是以fastcgi模式运行 参照:http://www.phpstudy.net/a.php/181.html ====IIS7/8快速安装PHP及phpStudy...

    php ci框架中加载css和js文件失败的原因及解决方法

    对框架中文件的所有请求都需要经过index.php处理完成,当加载外部的css和js文件的时候要使 用base_url()函数处理外部的...相对路径[removed][removed]访问失败 1、直接在src中输出 &lt;script src= &lt;?php echo ba

    nginx+php出现No input file specified解决办法

    经过反复的排查终于发现了问题,现将问题及解决分享如下: 问题原因分析 在GitHub上下载了一个开源的tp5项目,之前自己本地的网站运行都没有问题。但是安装了这个开源项目后就发现本地其他网站都无法访问了。访问...

    PHP Warning: Module modulename already loaded in问题解决办法

    出现标题这样的错误大概是: 1、模块加载了两次,所以php -i|grep Configure,看一下配置文件和配置include的目录,对于... 您可能感兴趣的文章:完美解决phpdoc导出文档中@package的warning及Error的错误PHP错误Warnin

    配置阿帕奇1.PHP4.23在WindowsXP下的IIS和Apache2两种服务器上的安装实例 http://www.phpe.net/articles/260.shtml

    5.遇到的问题及解决办法: 4.将php5apache2.dll(在D:\program files\php-5.0.0RC3-Win32下)复制到D:\apache2\Apache2\modules下。 若直接写成LoadModule ...

    scws23-php

    ===== PSCWS23 - 说明文档 =====...联系寻求解决。 [ 联系我们 ] SCWS 项目网站:http://www.ftphp.com/scws 我的个人 Email:hightman2@yahoo.com.cn (一般问题请勿直接来信,谢谢) -- 2008.12.20 - hightman

    程序猿ProMonkey 2.03.rar

    用于记录项目中遇到的BUG及解决方案,方便日后出现问题或学习时查看,优秀程序员必备。 3、网址书签 快速添加、浏览自己所喜爱的网站,把它放在网络服务器上,可以随时随地不受限制地访问。

    八度志愿管理系统VMS for php 1.7.rar

     - upload文件夹和session文件夹及badu/下的define.php、conn.php、config.php文件需要可写权限(777) 如何修改导航菜单中的微博 程序编码为UTF-8,请不要使用windows自带的编辑器。请使用其他编辑器如...

    nServer-v2.1023[FTP + MYSQL + HTTP + PHP(FCGI)]

    - 目录全部以小写命名,解决部分不标准PHP程序出现找不到目录的问题 2012年04月17日 - 优化error_page参数 2012年04月16日 - 更新MySQL版本为5.5.23 - 更新Nginx版本为1.0.15 - 优化Nginx配置文件 - 更改目录....

    程序猿ProMonkey v2.03.rar

    程序猿(ProMonkey)是...用于记录项目中遇到的BUG及解决方案,方便日后出现问题或学习时查看,优秀程序员必备。 3、网址书签 快速添加、浏览自己所喜爱的网站,把它放在网络服务器上,可以随时随地不受限制地访问。

    shearphoto1.4正式版发布!头像截图,拍照截图,头像上传

    加入相对路径设置问题解决,具体请查看relativeUrl 接口! 2:一如既往,修复已知BUG! 3: index.html &lt;form name="FORM"&gt; 改为 &lt;form id="ShearPhotoForm"&gt; 防止与其他插件冲突 具体细节,请查看...

    PHP生活分类信息网站模板

    如虚拟主机调试,则将网站文件全部上传到空间商指定的文件夹下,再执行安装过程,安装路径是你的网址后加install/index.php,比如你的网址是http://www.abc.com,则安装路径是http://www.abc.com/install/index.php,...

    程序猿ProMonkey v2.03

    程序猿(ProMonkey)是一款基于WEB的轻量级程序员个人...用于记录项目中遇到的BUG及解决方案,方便日后出现问题或学习时查看,优秀程序员必备。 3、网址书签 快速添加、浏览自己所喜爱的网站,把它放在网络服务器上,可

    phpstudy-x64.zip

    所以下载phpStudy之后切换到php5.2即可解决问题。 需要Zend Guard Loader的切换到php5.3和php5.4,但是必须是以fastcgi模式运行 参照:http://www.phpstudy.net/a.php/181.html ====IIS7/8快速安装PHP及phpStudy...

    KODExplorer 芒果云-资源管理器

    - 所有入口都加入index.php 解决部分服务器没有设置默认入口问题 ###ver2.4 `2014/6/8` ####update: - 语言选择 - 远程下载文件名优化 - 树目录事件优化 - 收藏夹点击 undefined - 没权限建立文件夹错误提示...

Global site tag (gtag.js) - Google Analytics