我必须处理复杂的目录层次结构,我面临着使用PHP包含路径的常见问题。
我在网上搜索过,但我找不到符合我需要的东西。
例如,我使用的是一个永远不会失败的简单目录层次结构:站点根目录中没有php脚本,只有一级子目录,这个子级别中的所有php脚本。要包含一个php文件,我只是使用相对路径,总是以'../'开头,就像在这个例子中一样:
include( '../my_subdirectory/my_script.php' ) ;
这样,我可以确定找到我想要的文件......
但有一些缺点:
所以我想要一种直接从网站根( 不 $ _SERVER ['DOCUMENT_ROOT']包含文件的方法,因为我可能将独立的网站放入此document_root的子目录中)。
我希望它是:
使用包含以下内容的.htaccess:
php_value include_path "/var/www/my_website/"
...做得很好,除了路径被硬编码到.htaccess中,因为某些原因而烦人:在我的情况下,我有prod,dev和测试版本的网站,而.htaccess是版本化的(它包含许多其他事情)。如果可能的话,我想要一个随处可见的.htaccess。将include_path设置为当前.htaccess路径的东西会很好。
那么......在PHP中处理include()和复杂目录层次结构的最佳实践是什么?
答案 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');