-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Под окружением понимается набор параметров определённых для текущего посетителя сайта, например
- lang - язык сайта,
- region - регион посетителя
- nostore - true - запрещает кэширование, для администратора сайта.
- zone - часовой пояс.
- ... - любые другие параметры
Расширение infrajs/env предоставляет интерфейс для определения окружения пользователя. Параметры окружения могут изменяться и изменять содержание страницы несмотря на заголовка Cache-control:public. Содержания, как бы динамическое, но при этом остаются все преимущества кэширования.
В подавляющем большинстве случаев пользователь попадает в правильное, определённое по умолчанию окружение и получает правильное содержание страницы. Если пользователь меняет окружение, то при получени старого кэша будет редирект. Для пользователя изменение окружения сразу приведёт к изменению страницы согласно установленным параметрам без проблем с кэшем, что и требуется. То есть страница кэшируемая, как статика может быть изменена пользователем без инструкций как обновить кэш браузера и т.п.
Делать многоязычный сайт с помощью этого расширения или как-то по другому остаётся на выбор разработчика, сама возможность не обязывает в окружении сохранять всё.
По смыслу окружение похоже на локаль в php.
При любом изменении дефолтных параметров окружения появляется новое имя окружения, которое записывается в cookie, что сделает кэш пользователя приватным Cache-control:private. Если этот пользователь сам получит кэш со старым окружением, то произойдёт переадресация на страницу с параметром ?-env=имя окружения - кэш такого адреса всегда соответствует указанному окружению.
Переадресация будет срабатывать до тех пор пока пользователь сразу не получит правильный ответ сервера, что зависит от времени кэша для динамики. Если динамика не кэшируется, то редирект никогда не потребуется, так как пользователь всегда будет получить ответ сервера в соответствии со своим окружением установленным в cookie -env.
location.reload(true) не используется. Такой вызов обновит кэш браузера, но не кэша на промежуточном сервере или CDN.
При первом посещении сайта пользователь может получить кэш промежуточного сервера и если у пользователя в cookie не установлено окружение, то полученный кэш будет считаться правильным, до тех пор пока пользователь реально не обратится к серверу или другому проежуточному кэш-серверу, который может определить иное окружение. Получится что сайт определит регион пользователя Москва, тот обновит страницу и сайт покажет, что пользователь уже из Самары, хотя реально допустим пользователь из Тагила... неточности это нормально. Как только пользователь явно укажет своё окружение, которое запишется в cookie и неожиданные изменения прекратятся.
Каждому набору параметров в окружении даётся какое-то сокращённое имя. Например, окружение blabla может содержать в себе информацию и о всех параметрах.
Локальный кэш браузера содержит заголовок Etag содержащий имя окружения и при запросе сервер поймёт, что кэш устарел. Отдельные параметры из окружения указываются в условиях кэширования Access::cache, Cache::exec программистом в зависимых скриптах.
Боты поисковых систем заходят на сайт с разных IP и в каждом случае будет сформировано нужное окружение. Предполагается, что поисковая система понимает, что содержание сайта зависит от региона и проиндексирует версии для всех регионов в отдельности для участия в поиске по разным регионам.
Имя окружения хранится в cookie. -env=bla Если его нет, определяется автоматически. Если есть, будет использоваться установленное.
- Параметр не должен быть приватным. Всё что находится в окружении определяет содержание страницы, которая попадает в кэш, как пользователя, так и провайдера или прокси-серверов, тем самым обеспечивая быструю загрузку страницы.
- При первом посещении страницы может показаться кэш окружению другого пользователя, должна быть значительная вероятность, что этот кэш подходит и для нового пользователя. То есть имеет географическую зависимость или редко изменяется.
- Окружение определяется для всего сайта и не зависит от разделов или страниц сайта.
- Разрешить кэширование. Если страница зависит от параметра и этот параметр не будет хранится в окружении, то содержание страницы получается динамическим и кэшировать такую страницу нельзя, но если вынести этот параметр в окружение, public-кэш будет возможен.
- Редкое изменение. Параметр окружения для пользователя меняется лишь в исключительной ситуация, изменение требует неприятного редиректа на каждой странице, которая была посещена, и на которую пользователь зайдёт снова после изменения.
- После изменения параметров окружения будет запрещено использовать CDN для этого пользователя и кэш этого пользователя станет приватным. Но даже тут CDN возможен до изменений окружения, то есть хоть как-то возможность, а для динамических страниц такой возможности нет вовсе.
- Для каждого набора будет создаваться отдельное имя и умножение параметров приведёт к безграничному росту имён, так как для каждой комбинации генерируется своё имя, которое сохраняется с параметрами в папке
~.env/и устанавливается в cookie.
Если динамика сайта заканчивается изменением темы, или если остальная динамика будет подтягиваться с AJAX, то чтобы разрешить public кэширование основного содержания тему можно и нужно вынести в окружение, как и остальные параметры мешающие включить кэширование, согласно описанию целесообразности.
Для варианта, когда обновление кэша привязано к дате посещения сайта администратором. Пользователю-администратору нужна возможность игнорировать кэш своего браузера. Даже если, те же страницы, после авторизации уже не будут выставлять заголовок Cache-control: Public, браузер может и не узнать об этом и будет продолжать использовать свой локальный кэш, согласно старым правилам. Установленный флаг в окружении будет приводить к редиректу и сделанные администратором изменения, несмотря на public кэш будут сразу применяться.
При посещении страницы, содержание которой берётся из локального кэша, скрипт сравнивает имя окружения собранной страницы с именем окружения хранящегося в cookie и если они разные выполняется location.replace('?-env=...');. Если посетитель перейдёт на новую страницу и снова обновит страницу и получит локальный старый кэш, переход сработает снова. При обновлении страницы со старым Etag c сервера придёт новый Etag и новый ответ попадёт в локальный кэш. Повторный заход пользователя на страницу не потребует перехода, так как cookie окружения совпадёт с окружением сгенерированой страницы.
Подробней про Etag
Параметры окружения, от которых зависит содержание ресурсов должны явно передаваться в адресе. php скрипты не могут использовать имя из кукиса для получения параметров, так как это приведёт к ошибкам в кэше по адресу. Если содержание меняется значит должен быть новый адрес, это обязывает передавать параметры в GET аргументах.
Интерфейс доступа к параметрам окружения по имени окружения используется только в шаблонах html в контроллере и шаблонах адресов до данных изменения адреса изменяет кэш слоя.
{~env.region}, {~env.lang}
В шаблонах слоёв обращаться к окружению нельзя, так как это станет скрытой зависимостью. Правильный подход - значение окружения передаётся параметром до файла-php с данными. В шаблоне используются данные без понимания какое окружение привело к формированию этих данных.
Так как для скриптов явно не указывается зависимость от этого параметра, система должна автоматически подставлять что-то в каждый AJAX запрос результат которого может поменяться от действий администратора. В infrajs всё нужное есть в админке все запросы с параметром -nostore=true возвращают заголовок Cache-control:no-store благодаря расширению infrajs/nostore.
Параметры окружения определяются по логике infrajs/mark по адресу /-env/?mark=sdw:lang=eng. Так как проверка устанавливаемых значений происходит на сервере, клиент не может полагаться, что значение установится.
/-env/?mark=sdw:lang=eng установит новый cookie если значение применится и возвращает все параметры.
На клиенте после изменения запускается check(); Env.get(name) возвращает актуальное значение параметра и зависимые слои обновляются.
Нужно определить функцию определения значения по умолчанию. Например, новый параметр region и вот функция, которая его определяет.
Env::add('region', function () {
return 'samara';
}, function ($newval) {
return in_array($newval, array('togliatti','samara'));
});Расширение infrajs/env по моим общей реализации предоставляет стандарт наименования параметров
Нужно определить функцию проверки параметра устанавливаемого пользователем Если новое значение проверку не проходит текущее значение не меняется.
- В папке с метками ~.env/ создаётся файл с правильным именем. В оригинальном файле даляются все параметры и остаётся только строчка с новым правильным именем для метки взамен оригинального.
Теоретически использование CDN не исключается, из расчёта что CDN находится в том же регионе и окружение определённое для него подойдёт большинству посетителей с большой вероятностью и CDN и будет тем самым проксирующим public сервером, до тех пор пока пользователь не изменит своё окружение и тогда за документом страницы должно сработать прямое обращение, а остальные ресурсы могут продолжать грузится с CDN. Но вот если location.reload(true) продолжит забирать страницу с CDN это приведёт к зависанию страницы. Защиты от зависания нет, нужно тестировать работу CDN и проверять будет ли запрос к реальному серверу при location.reload(true). И возможно автор не совсем корректно представляет работу CDN (сеть по доставки контента) по этому только теория.