Здесь была некоторая негибкость, которая помешала @genesis получить то, что ему нужно.
Поскольку мне в значительной степени «нужно» то же самое, вот мой (переформулированный) вопрос (и потенциальный ответ).
Допущения: приложение можно установить практически в любом месте, поскольку оно будет загружено кем-то из репозитория с открытым исходным кодом. Поэтому существует необходимость автоматического определения:
- Абсолютный путь к каталогу установки (например,
/var/www/myserver/mysubdir/
), который потребуется для включаемых файлов;
- Абсолютный URL для того же каталога, например, для навигации по меню и вызова файлов .php из любой точки приложения (например,
http://myserver.tld/mysubdir/
)
- Может быть неизвестный предел глубины для этих подкаталогов: например, в главном каталоге могут быть
/css
, /js
, но также могут быть такие вещи, как /admin/plugins/js
, которые, однако, могут потребовать получить config.php
из верхнего каталога, чтобы узнать о таких вещах, как строки подключения к базе данных, глобальные параметры приложения и т. д.
- Приложение само может использовать несколько уровней; пользователь, устанавливающий приложение, может также сделать то же самое (например,
/var/www/myserver
- это место, на которое указывает виртуальный хост, но конечный пользователь хочет, чтобы приложение было ниже /var/www/myserver/yes/I/really/want/it/this/deep
, и ожидает, что приложение будет полностью функциональным на http://myserver.tld/yes/I/really/want/it/this/deep
Я посмотрел, как это делает 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, ты это имел в виду?