【问题标题】:Dealing with include and complex directory hierarchy in PHP在 PHP 中处理包含和复杂的目录层次结构
【发布时间】:2010-10-05 12:47:13
【问题描述】:

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

我在网上搜索过,但没有找到适合我需要的东西。


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

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

这样,我就可以确定找到我想要的文件了……

但是有一些缺点:

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

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

我希望它是:

  • 仅集中在一个文件中
  • 无需任何更改即可从一台服务器移植到另一台服务器(如果可能)
  • 保持 php 的 include 简洁优雅,没有复杂的字符串 concat,应该这样工作:"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() 和复杂的目录层次结构的最佳实践是什么?

【问题讨论】:

  • 您包括哪些类型的文件?也许有一种更好的方法可以做到这一点,或者使用集中的自定义 include_file() 函数或自动加载

标签: php .htaccess


【解决方案1】:

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

PHP

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

PHP 5.3:

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

【讨论】:

  • 感谢您的回复,这样就避免了当一个文件包含一个包含另一个文件的文件时的麻烦......但实际上,路径'/yourfile.php'仍然是相对于当前文件的,不像我想要的那样相对于站点根目录。
  • 只要把前面的代码和'/../yourfile.php'之类的相对路径合并,加入root_path即可(希望你能预料到层级)
【解决方案2】:

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

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

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

并将其包含在每个脚本中,您可以轻松地进行相关包含:

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

如果您包含的是 PHP 类结构,您可能还想查看Autoloading,这是一个很棒的功能。

【讨论】:

  • 感谢您的回复,我会考虑的...例如我仍然更喜欢 .htaccess 方式(尽管我需要硬编码路径)。
  • @Cedric 如果你想要便携性,这就是要走的路
【解决方案3】:

我认为处理此问题的最佳方法是在您的 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');

【讨论】:

  • 不能在 httpd.conf 中这样做,因为我在同一台服务器上有许多不同的网站。它或多或少像在 .htaccess 中编写 'php_value include_path "/var/www/my_website/" '...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
相关资源
最近更新 更多