ЕЖЕНЕДЕЛЬНАЯ РЕКЛАМНАЯ ГАЗЕТА ДЛЯ ПРЕДПРИЯТИЙ «Деловая неделя» (Иркутск) | |||||||||||||
|
|||||||||||||
Централизованное хранение js и css файлов для разных сайтов
Когда (почти всегда :-)) несколько сайтов находится на одной учётной записи хостинга, очень удобно бывает использовать общую библиотеку PHP-функций (а в идеале – фреймворк), доступ к которой из всех сайтов легко организовать по принципу '../' (повторить, сколько понадобится) от DOCUMENT_ROOT. Но библиотеки образуются не только из PHP. От сайта к сайту, со временем накапливается ряд типичных функций js (что-нибудь вроде getCookie или addLoadEvent) и ряд часто используемых правил css (типа .abs {position:absolute;}, .rigth {text-align:right;}). В результате собираются небольшие библиотеки common.js, styles.css. Доступ к js и css уже не организуешь по простому принципу '../' от DOCUMENT_ROOT (потому что выше DOCUMENT_ROOT для http-доступа пространства не существует), и клиентские библиотеки приходится дублировать. Это достаточно неудобно: нормальные библиотеки ведь постоянно развиваются, обновляются, и приходится заниматься нудной рутинной синхронизацией. Существуют ли способы централизованного изменения библиотек js, css в пределах одного хостинга? Можно ли избежать ручного копирования новых версий на каждый сайт? Варианты решений1. Понятно, что есть тупой и однозначный способ централизации «в пределах мира» – поместить js и css библиотеки на отдельный домен, и в коде клиентских страниц указывать путь к файлам именно на этом домене. Но такой способ опасен: в случае недоступности «центрального» домена куча сайтов враз приобретёт самый чудовищный вид. 2. Ссылки на служебные файлы в HTML-коде должны всё-таки всегда вести приблизительно в ту же папку, откуда берутся сами страницы. В этом случае, если сервер упадёт, так отключится всё вместе – понятно и предсказуемо. Но вот js и css данные вовсе не обязательно хранить прямо в файлах с соответствующими именами (мы же не храним информацию, например, для интернет магазина в HTML-файлах). 2.1. Можно хранить данные служебных файлов в базе данных. Одна база данных может быть общей для нескольких сайтов. Даже на разных хостингах. 2.2. Файлов клиентских библиотек не так уж и много, и в этом плане БД не нужна. Удобнее хранить и обновлять их в центральном хранилище именно в виде файлов (и редактировать предназначенными для этого специальными программами, а не через CMS). РеализацияПредположим, у нас два сайта в папках: /home/my_sites/site1/public_html, /home/my_sites/site2/public_html. А общие для сайтов файлы хранятся в папке /home/my_sites/common_lib. Предполагаем также, что в файлах .htaccess каждого сайта есть (достаточно обычный) набор правил, перенаправляющий все запросы на index.php: В этом случае в файле index.php (или файле, подключаемом к нему по include) можно поместить примерно следующий код (PHP) для вывода js или css данных: Можно забирать данные и с другого домена (другого хостинга) через http. Но, конечно, не в режиме реального времени (а по расписанию). Потому что в случае недоступности удалённого ресурса будут те же грабли, что и в Варианте 1. Есть, правда, вариант, принципиально решающий эту проблему: искать библиотеку на удалённом ресурсе, а при её недоступности использовать «центральное хранилище» своего хостинга. Но тут всё равно в реальном времени будут тормоза (время на проверку доступности удалённого хоста может сильно растягиваться). Вариант с кэшированиемФайлы js и css могут забирать достаточно большой объём трафика, поэтому в норме они всегда должны быть именно файлами и хорошо кэшироваться (надолго застревать в кэше браузеров). Если примирить это требование с нашей системой централизованного хранения, получится идеальная схема. Создать её, оказывается, не так уж и сложно, просто надо продумать логику:
Система проверки обновлений может быть двух уровней. Первый уровень – хостинга – «непрерывная» или постоянная проверка, при каждом обращении к любой странице сайта. Второй уровень – синхронизации с удалённым хранилищем – проверка по расписанию. Второй уровень достаточно очевиден, по-другому его организовать просто нельзя. А вот с первым есть одна сложность: мы не можем проверить обновление конкретного файла по http-запросу к этому файлу – потому что по http-запросу этот файл будет просто отдан клиенту (даже не Апачем, а nginx'ом!), а PHP (или другой серверный скрипт) об этом ничего знать не будет. Поэтому логика обновлений первого уровня может быть только «тотальной»: при любом задействовании серверного скрипта (при формировании любой страницы для клиента) проверять все файлы в центральном хранилище хостинга (в нашем примере – папка /home/my_sites/common_lib): Можно и ускорить проверку: создать, например, в папке библиотеки флажок в виде файла upd.ini с текстом внутри "0" или "1". Но кто будет изменять значение этого флага? Ясно, что при копировании файлов по ftp такая схема не сработает. Но вполне может быть работоспособной, если договориться о загрузке обновлённых файлов в центральное хранилище только через веб-интерфейс – тогда при загрузке файлов сам скрипт загрузки вполне может менять значение флажка на "1"; а скрипт проверки с сайта site1 после обновления будет «сбрасывать» флажок на "0". Блин. Но тогда site2 не узнает об обновлении! Значит, это должен быть не флажок, а поле типа timestamp ('2011-12-12 12:00:01'); и такой же проверочный файл upd.ini должен быть на каждом сайте; а скрипты обновления с сайтов должны будут сверять даты центрального файла upd.ini и своего. Н-да. Если проверяемых файлов всего 5 (как у нас сейчас), какая х.р разница, использовать upd.ini или нет?.. D.M., admin Добавить комментарий: |