处理PHP中的include和复杂目录层次结构

时间:2010-10-05 12:47:14

标签: php .htaccess

我必须处理复杂的目录层次结构,我面临着使用PHP包含路径的常见问题。

我在网上搜索过,但我找不到符合我需要的东西。


例如,我使用的是一个永远不会失败的简单目录层次结构:站点根目录中没有php脚本,只有一级子目录,这个子级别中的所有php脚本。要包含一个php文件,我只是使用相对路径,总是以'../'开头,就像在这个例子中一样:

include( '../my_subdirectory/my_script.php' ) ;

这样,我可以确定找到我想要的文件......

但有一些缺点:

  • 我不能有多个级别的子目录(原因:当一个文件包含一个包含另一个文件的文件时,用于包含第三个文件的路径不是相对于第二个文件文件的路径,而是相对于第一个文件的路径。)。
  • 来自C ++背景(使用手工制作的makefile),我一直认为这是一种肮脏的方式

所以我想要一种直接从网站根 $ _SERVER ['DOCUMENT_ROOT']包含文件的方法,因为我可能将独立的网站放入此document_root的子目录中)。

我希望它是:

  • 仅集中在一个文件中
  • 从服务器移植到另一个服务器而不做任何更改(如果可能)
  • 保持php的包含简单优雅,没有复杂的字符串连接,这应该是这样的:“include('directory_a / directory_b / my_php_script.php')”

使用包含以下内容的.htaccess:

php_value include_path "/var/www/my_website/" 

...做得很好,除了路径被硬编码到.htaccess中,因为某些原因而烦人:在我的情况下,我有prod,dev和测试版本的网站,而.htaccess是版本化的(它包含许多其他事情)。如果可能的话,我想要一个随处可见的.htaccess。将include_path设置为当前.htaccess路径的东西会很好。

那么......在PHP中处理include()和复杂目录层次结构的最佳实践是什么?

3 个答案:

答案 0 :(得分:2)

一个好方法是使用这样的绝对路径:

Php< 5.3:

include(dirname(__FILE__) . '/yourfile.php');

PHP 5.3:

include(__DIR__. '/yourfile.php');

答案 1 :(得分:0)

__FILE__常量将始终指向当前文件的绝对路径。

如果您在站点根目录的脚本中执行此操作:

define("ROOT_DIRECTORY", dirname(__FILE__));

并将其包含在每个脚本中,您可以轻松地做相对包括:

include ROOT_DIRECTORY."/dir1/dir2/dir3/index.php";  

如果你所包含的是PHP类结构,你可能还想查看Autoloading这是一个伟大的功能。

答案 2 :(得分:0)

我认为处理此问题的最佳方法是在vhost或httpd.conf中为每个环境设置“SetEnv指令”。

的httpd.conf:

SetEnv INCLUDES_DIR /var/www/my_website/

在每个PHP文件中,您都可以使用以下$ _SERVER变量

include_once($_SERVER['INCLUDES_DIR'].'/my_subdirectory/my_script.php');