这里有一些不文明行为,阻止了@genesis 得到他需要的东西。
因为我几乎“需要”同样的东西,所以这是我的(重新表述的)问题(以及可能的答案)。
假设:应用程序几乎可以安装在任何地方,因为它会被某人从开源存储库下载。所以需要自动判断:
- 包含文件所需的安装目录的绝对路径(例如
/var/www/myserver/mysubdir/);
- 同一个目录的绝对URL,例如,用于菜单导航和从应用程序中的任何位置调用 .php 文件(例如
http://myserver.tld/mysubdir/)
- 这些子目录可能存在未知的深度限制:例如,在主目录下,可能有
/css、/js,但也可能有/admin/plugins/js 之类的东西,但可能需要检索@987654326 @ 从顶级目录了解数据库连接字符串、全局应用程序参数等内容。
- 应用程序本身可能会单独使用几个级别;安装应用程序的用户也可能执行相同的操作(例如,
/var/www/myserver 是虚拟主机指向的位置,但最终用户希望应用程序位于 /var/www/myserver/yes/I/really/want/it/this/deep 下,并希望应用程序在 @987654329 处功能齐全@
我已经了解了 WordPress 是如何做到这一点的。基本上,WordPress 要求指向目录结构的 URL 由用户硬编码(其他应用程序不需要)。然后它使用
提取目录路径(用于文件包含)
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
这看起来相当简洁,但实际上,问题在于如果您在目录层次结构中“很深”,则可能无法包含定义 ABSPATH 的文件。 WordPress 一直在做的是调用这两行代码并在确保获得有效的 ABSPATH 后包含所需的配置文件。
但其他软件似乎组织得更好。它们会自动将 正确 URL 提取到网络服务器指向的目录;而且他们更神奇地能够找到所有包含文件的位置,无论它们位于子目录结构的多深。
我能做的最好的就是模拟 WordPress:“强制”用户在配置文件中写入 URL,并且在所有级别和子级别上,几乎每个文件都使用
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
并尝试通过猜测来包含全局配置文件(例如,测试它是否在同一级别、上一级、上两级等等......)。
这非常混乱,但似乎这就是一些黄金级应用程序(如 WordPress)正在做的事情。其他人似乎更有条理。他们是怎么做到的呢?我不知道。
@genesis,这就是你的想法吗?