Помещение основных классов выше корня сети – хорошая или плохая идея?

Мы разрабатываем несколько веб-приложений для запуска на нашем собственном сервере, которые будут совместно использовать ряд основных классов в рамках своей установки MVC.

Я думаю о том, чтобы помещать классы выше веб-корня, поэтому все приложения могут автоматически загружать () эти классы, используя только одну копию, и не беспокоиться о проблемах синхронизации.

Специализированные классы будут размещаться в соответствующем веб-каталоге, но общие библиотеки будут находиться в / var / www / shared-libraries или что-то подобное.

Помимо потенциального сбоя всех сайтов одновременно с плохой строкой кода, есть ли причина, по которой я не хотел бы идти по этому пути?

Благодарю.

Zend Framework использует этот метод, который позволяет всему приложению безопасно выводить чувствительный PHP-код в виде обычного текста, поскольку все находится за пределами корня документа и с помощью mod_redirect, чтобы узнать, какой модуль / контроллер / действие нужно отправить.

Основной макет проекта выглядит примерно так:

application - controllers - views - - scripts public - .htaccess - index.php library - Zend 

и имея ../library в вашем пути включения, вы можете легко ../library все классы Zend (ig Zend_View) из любого места приложения. Естественно, Zend также поставляется с автозагрузчиками классов для помощников вида и других префиксов пользовательских классов, но это не касается области вопросов.

Поскольку все находится за пределами корня документа (/ public), единственный скрипт, который может видеть пользователь (в случае, если что-то пойдет не так, и пользователи начинают видеть открытый PHP-код) – это вызов бутстрапа приложения и других строк инициализации (ig включают пути и и некоторые константы, но вы могли бы также инициализировать все, включая другой внешний файл …).

Короче говоря, да, это хорошая идея и хорошая практика – поставить основные классы вне корня документа. Все, что вам нужно, это добавить путь к вашей общей библиотеке в списке include include с чем-то вроде:

 set_include_path(implode(PATH_SEPARATOR, array( LIBRARY_PATH, get_include_path(), ))); 

где LIBRARY_PATH – относительный или абсолютный путь к вашей общей библиотеке.

Помните, однако, что больше путей, которые вы добавляете, будут более медленными автозагружаемыми классами. Хорошая практика состоит в том, чтобы иметь только около 3 путей или меньше. Посмотрите, как Zend удалось обойти это со своими автозагрузчиками .

Мало того, что это хорошая техника, но вы должны делать это каждый раз, когда сможете!

Вы никогда не знаете, когда вы столкнетесь с sys-admin-of-hell, который отключает PHP и позволяет Apache перекачивать файлы в виде полнотекстового текста! 😉

И у меня был этот опыт из первых рук. Все было в безопасности, поскольку никакой код не был закачан пользователям.