PHP include/require路径问题

include/require语句用于包含并运行指定文件。具体用法见PHP手册。

使用这两条语句时要十分注意路径的使用。一些人会习惯使用相对路径(比如我),如果不对PHP进行任何配置就直接使用相对路径,那肯定会撞南墙。例如如下目录结构:

/
/common/
/lib/

/index.php 需要require /common/header.php 则直接 require ‘common/header.php’; 即可。这种语句是不会出错的,PHP会从当前目录向下层目录寻找header.php。问题来了,如果 /common/header.php 需要require /lib/config.php 怎么办?直接的想法是这样做:

require '../lib/config.php';

我第一次就是怎么做的,然后执行脚本的时候PHP抛出了找不到这个文件的错误。解决办法有二(或更多):

方法一:使用绝对路径

require dirname(__FILE__).'/../lib/config.php';

使用 dirname(__FILE__) 将获得当前文件所在的绝对路径。这种方法也即使用绝对路径来指定文件位置。

方法二:设定include_path

指定include_path。参考自PHP文档,includepath string:指定一组目录用于 require(),include() 和 fopenwithpath() 函数来寻找文件。格式和系统的 PATH 环境变量类似:一组目录的列表,在 UNIX 下用冒号分隔,在 Windows 下用分号分隔。 既然这样,只要修改PHP配置文件,将脚本所在的根目录加入到includepath就可以使用相对目录了。例如项目脚本根目录在 /var/www/project 则编辑PHP配置文件,在include_path中加入 /var/www/project 。这样,我们首先想到的相对目录办法就可以使用了。

实际上在执行include / require等语句的时候,PHP会首先查找include_path中指定的目录内是否有对应文件,如果没有则将path置成当前文件所在的目录,认为当前目录为根目录并不支持相对路径。除非使用绝对路径,否则不能查找同级其他目录的文件。

喜欢这篇文章?

欢迎订阅 PureWeber.com - 纯粹互联网。接收免费的更新提醒,以及订阅读者独家优质内容。

付建宇

讨论

  1. vta 回复

    单入口程序解决路径问题,我对../../../很敏感,文件单体移植性低。

    • 没有 ../../../ 也一样存在你所说的文件单体移植性的问题啊。

  2. vta 回复

    应用的内部文件 include path依托index入口的位置,内部文件的文件包含路径是很清晰的。 至于index包含内部文件的时候可以像uchome那样 require_once libfile(‘home/’.$mod, ‘module’); 路径规则由libfile函数定义。

    至少单入口程序在调整应用内部架构的时候,不用打开每个文件,把../改成../../或者类似,直接改libfile函数

  3. 恩。有道理。把库文件路径规则封装起来是个不错的方案。

    不过这个跟程序是否是单入口关系不大,只要有一个全局共享的根路径配置即可。或者干脆把根路径配置作为libfile()内部的一个静态变量。

加入讨论

电子邮件地址不会被公开。 必填项已用*标注