infrajs / env
Installs: 2 175
Dependents: 4
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 0
Requires
- infrajs/ans: ~1
- infrajs/event: ~1
- infrajs/load: ~1
- infrajs/mark: ~1
- infrajs/nostore: ~1
- infrajs/path: ~1
- infrajs/template: ~1
README
Установка через composer
{
"require":{
"infrajs/env":"~1"
}
}
Использование
//Определено окружение или нет. Проверяется 1 - GET -env и 2 - COOKIE -env. Env::is(); //Возвращает имя окружение. Если окруежние определено по умолчанию, то имя - пустая строка. Env::name(); //Возвращает значение указанного параметра окружения Env::get(name); //Для определения нового параметра окружения нужно указать функцию определения значения по умолчанию и функцию проверки установленного пользователем значения. Env::add(name, $fndef, $fncheck);
Использование c infrajs
У первого слоя нужно указать свойство environment
{ "environment":true }
Описание
Под окружением понимается набор параметров определённых для текущего посетителя сайта, например
- lang - язык сайта,
- region - регион посетителя
- zone - часовой пояс.
- nostore - true - запрещает кэширование, для администратора сайта.
- ... - любые другие параметры
По смыслу окружение похоже на локаль в php.
Расширение infrajs/env предоставляет интерфейс для определения окружения пользователя. Параметры окружения могут изменяться и изменять содержание страницы несмотря на заголовка Cache-control:public. Содержания, как бы динамическое, но при этом остаются все преимущества кэширования.
В подавляющем большинстве случаев пользователь попадает в правильное, определённое по умолчанию окружение и получает правильное содержание страницы. Если пользователь меняет окружение, то при получени старого кэша будет редирект. Для пользователя, изменение окружения сразу приведёт к изменению страницы, согласно установленным параметрам, без проблем с кэшем, что и требуется. То есть, кэшируемая страница может быть изменена пользователем без инструкций, как обновить кэш браузера и т.п.
Делать многоязычный сайт с помощью этого расширения или как-то по другому остаётся на выбор разработчика, сама возможность не обязывает в окружении сохранять всё.
При любом изменении дефолтных параметров окружения появляется новое имя окружения, которое записывается в cookie, что сделает кэш пользователя приватным Cache-control:private. Если этот пользователь сам получит кэш со старым окружением, то произойдёт переадресация на страницу с параметром ?-env=имя окружения - кэш такого адреса всегда соответствует указанному окружению.
Переадресация будет срабатывать до тех пор пока пользователь сразу не получит правильный ответ сервера, что зависит от времени кэша для динамики. Если динамика не кэшируется, то редирект никогда не потребуется, так как пользователь всегда будет получить ответ сервера в соответствии со своим окружением установленным в cookie -env.
location.reload(true) не используется. Такой вызов обновит кэш браузера, но не кэш на промежуточном сервере или CDN.
При первом посещении сайта пользователь может получить кэш промежуточного сервера и если у пользователя в cookie не установлено окружение, то полученный кэш будет считаться правильным, до тех пор пока пользователь реально не обратится к серверу или другому проежуточному кэш-серверу, который может определить иное окружение. Получится, что сайт определит регион пользователя Москва, тот обновит страницу и сайт покажет, что пользователь уже из Самары, хотя реально допустим пользователь из Тагила... неточности это нормально. Как только пользователь явно укажет своё окружение, которое запишется в cookie и неожиданные изменения прекратятся.
Имя окружения
Каждому набору параметров в окружении даётся какое-то сокращённое имя, обычно 2 или 3 символа.
Локальный кэш браузера содержит заголовок Etag содержащий имя окружения и при запросе сервер поймёт, что кэш устарел. Отдельные параметры из окружения указываются в условиях кэширования Access::cache, Cache::exec программистом в зависимых скриптах.
Боты поисковых систем заходят на сайт с разных IP и в каждом случае будет сформировано нужное окружение. Предполагается, что поисковая система понимает, что содержание сайта зависит от региона и проиндексирует версии для всех регионов в отдельности для участия в поиске по разным регионам.
Имя окружения хранится в cookie. -env=bla Если его нет, определяется автоматически. Если есть, будет использоваться установленное.
Целесообразность хранения параметра в окружении
- Параметр не должен быть приватным. Всё что находится в окружении определяет содержание страницы, которая попадает в кэш, как пользователя, так и провайдера или прокси-серверов, тем самым обеспечивая быструю загрузку страницы.
- При первом посещении страницы может показаться кэш окружению другого пользователя, должна быть значительная вероятность, что этот кэш подходит и для нового пользователя. То есть имеет географическую зависимость или редко изменяется.
- Окружение определяется для всего сайта и не зависит от разделов или страниц сайта.
- Разрешить кэширование. Если страница зависит от параметра и этот параметр не будет хранится в окружении, то содержание страницы получается динамическим и кэшировать такую страницу нельзя, но если вынести этот параметр в окружение, public-кэш будет возможен.
- Редкое изменение. Параметр окружения для пользователя меняется лишь в исключительной ситуация, изменение требует неприятного редиректа на каждой странице, которая была посещена, и на которую пользователь зайдёт снова после изменения.
- После изменения параметров окружения будет запрещено использовать CDN для этого пользователя и кэш этого пользователя станет приватным. Но даже тут CDN возможен до изменений окружения, то есть хоть как-то возможность, а для динамических страниц такой возможности нет вовсе.
- Для каждого набора будет создаваться отдельное имя и умножение параметров приведёт к безграничному росту имён, так как для каждой комбинации генерируется своё имя, которое сохраняется с параметрами в папке
~.env/
и устанавливается в cookie.
Хранение темы сайта в окружении
Если динамика сайта заканчивается изменением темы, или если остальная динамика будет подтягиваться с AJAX, то чтобы разрешить public кэширование основного содержания тему можно и нужно вынести в окружение, как и остальные параметры мешающие включить кэширование, согласно описанию целесообразности.
Флаг - nostore
Для варианта, когда обновление кэша привязано к дате посещения сайта администратором. Пользователю-администратору нужна возможность игнорировать кэш своего браузера. Даже если, те же страницы, после авторизации уже не будут выставлять заголовок Cache-control: Public, браузер может и не узнать об этом и будет продолжать использовать свой локальный кэш, согласно старым правилам. Установленный флаг в окружении будет приводить к редиректу и сделанные администратором изменения, несмотря на public кэш будут сразу применяться. Такое обновление также бдет сбросывать кэш у динамически подключаемых расширений если администртивный режим будет всем запросам автоматически добавлять нужный ключ запрещающий кэширование динамики в браузере.
Обновление локального кэша
При посещении страницы, содержание которой берётся из локального кэша, скрипт сравнивает имя окружения собранной страницы с именем окружения хранящегося в cookie и если они разные выполняется location.replace('?-env=...');
. Если посетитель перейдёт на новую страницу и снова обновит страницу и получит локальный старый кэш, переход сработает снова. При обновлении страницы со старым Etag c сервера придёт новый Etag и новый ответ попадёт в локальный кэш. Повторный заход пользователя на страницу не потребует перехода, так как cookie окружения совпадёт с окружением сгенерированой страницы.
Подробней про Etag
Обновление локального кэша ресурсов
Параметры окружения, от которых зависит содержание ресурсов должны явно передаваться в адресе. php скрипты не могут использовать имя из кукиса для получения параметров, так как это приведёт к ошибкам в кэше по адресу. Если содержание меняется значит должен быть новый адрес, это обязывает передавать параметры в GET аргументах.
Интерфейс доступа к параметрам окружения по имени окружения используется только в шаблонах html в контроллере и шаблонах адресов до данных изменения адреса изменяет кэш слоя.
{Env.get(:region)}
, {Env.name()}
Значение окружения должно передаваться явно параметром до файла-php с данными.
Использование nostore
Так как для скриптов явно не указывается зависимость от этого параметра, система должна автоматически подставлять что-то в каждый AJAX запрос результат которого может поменяться от действий администратора. В infrajs всё нужное есть в админке все запросы с параметром -nostore=true возвращают заголовок Cache-control:no-store благодаря расширению infrajs/nostore.
Параметры окружения
Параметры окружения определяются по логике infrajs/mark по адресу /-env/?mark=sdw:lang=eng. Так как проверка устанавливаемых значений происходит на сервере, клиент не может полагаться, что значение установится.
?-env=:lang=en
установит параметр окружения lang значение en. Будет сгенерировано имя окружения и установлен cookie
?-env=
сбросить параметры окружения на значения по умолчанию. cookie будет удалён.
На клиенте при переходе без полной перезагрузки страницы изменения также применятся. Запускается Controller.check(); И в зависимых слоях Env.get(name) вернёт новое значение и слои перепарсятся использовов уже актуальные значение параметров окружения.
Для определения нового параметра
Нужно определить функцию определения значения по умолчанию. Например, новый параметр region и вот функция, которая его определяет.
Env::add('region', function () { return 'samara'; }, function ($newval) { return in_array($newval, array('togliatti','samara')); });
Для всех новых параметров создаются отедльные расширения. Например, infrajs/lang, infrajs/region.
CDN
Теоретически использование CDN не исключается, из расчёта что сервер-CDN находится в том же регионе и именно раздающий сервер делает запрос за содержанием для CDN. Окружение определённое для местного сервера подойдёт и большинству посетителей и CDN будет, тем самым проксирующим public сервером.