infrajs/env

此包的最新版本(v1.0.12)没有可用的许可信息。

v1.0.12 2022-03-27 09:36 UTC

This package is auto-updated.

Last update: 2024-09-10 13:10:14 UTC


README

通过composer安装

{
	"require":{
		"infrajs/env":"~1"
	}
}

使用方法

//Определено окружение или нет. Проверяется 1 - GET -env и 2 - COOKIE -env.
Env::is();

//Возвращает имя окружение. Если окруежние определено по умолчанию, то имя - пустая строка.
Env::name();

//Возвращает значение указанного параметра окружения
Env::get(name);

//Для определения нового параметра окружения нужно указать функцию определения значения по умолчанию и функцию проверки установленного пользователем значения.
Env::add(name, $fndef, $fncheck);

使用 infrajs

第一层需要指定 环境 属性

{
	"environment":true
}

描述

环境是指为当前网站访问者定义的一组参数,例如

  • lang - 网站语言,
  • region - 访问者地区
  • zone - 时区。
  • nostore - true - 禁止缓存,适用于网站管理员。
  • ... - 任何其他参数

在意义上,环境类似于php中的locale。

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 如果没有,则自动确定。如果有,将使用已设置的。

将参数存储在环境中的合理性

  1. 参数不应该是私有的。环境中的一切都定义了页面内容,无论是用户、提供者还是代理服务器,从而确保页面快速加载。
  2. 在首次访问页面时,可能会显示其他用户的缓存环境,有很大的可能性这个缓存也适合新用户。也就是说,它具有地理依赖性或很少改变。
  3. 环境适用于整个网站,不依赖于网站的章节或页面。
  4. 允许缓存。如果页面依赖于参数,而这个参数不在环境中存储,那么页面内容将是动态的,无法缓存此类页面,但如果将此参数移至环境,则可以进行公共缓存。
  5. 很少改变。用户的环境参数仅在极少数情况下改变,改变需要在每个访问过的页面上进行不愉快的重定向,以及用户在更改后再次访问的页面。
  6. 更改环境参数后,将禁止为此用户使用CDN,并且此用户的缓存将变为私有。但即使在更改环境之前,CDN也有可能,也就是说,有一丝可能,但对于动态页面则完全没有这种可能。
  7. 将为每个集合创建一个单独的名称,参数的乘积会导致名称无限增长,因为每个组合都生成一个唯一的名称,该名称与参数一起保存在~.env/文件夹中,并设置在cookie中。

在环境中存储网站主题

如果网站的动态性以更改主题结束,或者如果其他动态性将通过AJAX获取,那么为了允许公共缓存主要内容,可以将主题以及其他阻止缓存的内容移至环境,正如合理性的描述所要求的那样。

标志 - nostore

对于与管理员访问日期关联的缓存更新的情况。管理员用户需要忽略自己浏览器的缓存。即使经过身份验证后,相同的页面也不会设置Cache-control: Public标题,浏览器可能不知道这一点,并会继续使用自己的本地缓存,根据旧规则。环境中的设置标志将导致重定向,并且管理员所做的更改,尽管有公共缓存,也将立即应用。这种更新还将重置动态扩展的缓存,如果管理员模式将自动向所有请求添加禁止在浏览器中缓存动态内容的键。

更新本地缓存

在访问从本地缓存获取内容的页面时,脚本会比较收集的页面环境名称与保存在cookie中的环境名称,如果它们不同,则执行location.replace('?-env=...');。如果访客转到新页面并再次更新页面并获得本地旧缓存,转换将再次生效。当从服务器更新具有旧Etag的页面时,将收到新的Etag和新的响应将进入本地缓存。用户再次访问页面时不需要转换,因为cookie环境将与生成的页面环境相匹配。有关Etag的详细信息。

更新资源本地缓存

依赖内容的环境参数应显式地传递到地址中。php脚本不能使用cookie中的名称来获取参数,因为这会导致缓存地址错误。如果内容更改,则必须有一个新的地址,这要求在GET参数中传递参数。

按环境名称访问参数的接口仅用于控制器中的html模板和地址模板,在数据更改地址之前,它将更改缓存层的缓存。{Env.get(:region)}{Env.name()}

环境值应显式地作为参数传递给php数据文件。

使用nostore

由于脚本未明确指定对此参数的依赖,系统应自动在每次AJAX请求中填充某个值,该请求的结果可能会因管理员操作而改变。在infrajs中,所有需要的功能都在管理员界面,所有带有参数-nostore=true的请求都通过infrajs/nostore扩展返回Cache-control:no-store头部。

环境参数

环境参数根据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/langinfrajs/region

CDN

理论上,使用CDN是可行的,考虑到CDN服务器位于同一区域,并且负责向CDN分发内容的分发服务器执行请求。为本地服务器定义的环境对于大多数访客也适用,CDN将因此作为公共服务器的代理。

示例

http://kvant63.ru