设为首页 收藏本站
查看: 749|回复: 0

[经验分享] Php路径问题及其解决方法

[复制链接]

尚未签到

发表于 2017-3-24 09:41:12 | 显示全部楼层 |阅读模式
  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路径问题的其他解决方法做一个简单的总结。­
  ­

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-354430-1-1.html 上篇帖子: php xmlrpc的简单实用 下篇帖子: Zend API:深入 PHP 内核
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表