foun10 / smartproxy
This package is not auto-updated.
Last update: 2024-09-27 17:13:59 UTC
README
如果ScaleCommerce的Smartproxy HTML缓存可用并设置,则可以使用此模块。该模块处理一些缓存逻辑,并在缓存的HTML中替换(会话)占位符。
Smartproxy默认信息
- Smartproxy将缓存所有对SEO URL的请求
- 所有POST请求都不会被缓存
- GET参数将影响哈希URL,并导致新的缓存文件
环境
并非每个可缓存的调用请求都是相同的。例如,如果您已设置不同的货币,则此信息将存储在会话中,并且不会影响SEO URL。因此,需要将这些信息在Smartproxy上可用,以便在设置这些环境变量时进行不同的缓存。
可以设置一个cookie,其值在Smartproxy上用于确定不同的缓存哈希。
cookie键是smartproxy_env_key
,它将在第一次通过Smartproxy的调用上设置。此外,如果此cookie未设置,则有一些JS逻辑将立即获取值(有关更多信息,请参阅JavaScript逻辑部分)。
设置您的环境
默认情况下,模块将根据以下信息从以下信息创建环境键的哈希
- 排序:如果设置了alist排序
- 已登录:如果用户已登录
- 每页产品数:列表中显示的产品数量
- 货币:选择的货币
- 语言:选择的语言
- 商店:当前商店ID
所有值将合并在一起,进行哈希处理,并设置为cookie值。当更改这些变量中的某些变量时,将再次设置cookie值。
请注意,影响这些变量之一的请求必须是不可缓存的 - 例如,通过POST请求或URL上的特定参数(有关如何设置缓存调用,请参阅如何设置缓存调用?)
对此逻辑进行调整
您有机会对此逻辑进行调整。也许您不需要用户是否登录的信息,或者您有其他变量应该影响cookie值。
您可以直接扩展类foun10\SmartProxy\Environment\EnvironmentKeyLogics
并重写函数customizeEnvironmentValues(array $values)
。$values参数将设置默认键,您可以简单地删除/调整/添加这些键。例如,要删除已登录状态,可以简单地unset($values['loggedIn']);
必需的cookie
smartproxy_env_key
被定义为必需cookie,因此如果此cookie未设置,则页面加载后将有JS调用。这确保了在第二次请求时正确设置环境。
如果您需要额外的必需cookie,您可以通过扩展函数foun10\SmartProxy\Core\SmartProxy::getMandatoryCookies()
来设置这些cookie。
如果需要必需cookie但未设置,则模块将调用控制器foun10SmartProxyEnvironmentSetter
并设置cookie。如果您调整了必需cookie,则需要扩展函数foun10\SmartProxy\Core\SmartProxy::setAdditionalCookies()
,有关如何查看foun10\SmartProxy\Core\SmartProxy::setCookies()
的信息。
会话参数和替换
表单中的 stoken 参数将被占位符替换,以便完整的 HTML 可缓存。例如:<input type="hidden" name="stoken" value="###smartproxy_stoken###" />
此替换仅在检测到可缓存调用时才会发生。
如果 cookie smartproxy_stoken
已经设置,Smartproxy 本身将在将 HTML 发送到浏览器之前替换占位符。
如果没有或如果是第一次请求,有一些 JS 逻辑(见 JS 逻辑)将在每个表单输入中进行替换。
您可以通过扩展 foun10\SmartProxy\Core\SmartProxy::getInputValueReplacements()
函数来设置这些替换。
OXID 配置调整
为了确保 stoken 替换正确并且可以无问题地将产品添加到购物车中,您需要调整配置文件以强制启动会话
$this->blForceSessionStart = true;
没有 SEO URL 的请求缓存
在 Smartproxy 默认设置中,所有 SEO url 的请求都将被缓存。但您可能还想缓存到 index.php 的请求
为了使对 index.php 的调用也可缓存,Scale Commerce 需要调整 Smartproxy 逻辑。为此,此模块实现了一个检查,以便可以选择是否缓存。
信息
Scale Commerce 有两种方法可以应用缓存:“黑名单”和“白名单”。
这导致了 Smartproxy 解释 HTTP 响应头 x-sc-sp-cache
的方式
Scale Commerce 可以通过这两种方式设置缓存
- 只有当设置
x-sc-sp-cache: yes
时才缓存请求(白名单),所有其他请求都不会缓存 - 当设置
x-sc-sp-cache: no
时不缓存请求(黑名单),所有其他请求都会缓存
该模块始终发送 HTTP 头 x-sc-sp-cache
。您可以设置其值是否为 yes
或 no
的逻辑。
注意:该模块仅在控制器逻辑使用时设置此 HTTP 头。
$header = oxNew(\OxidEsales\Eshop\Core\Header::class);
$header->sendHeader();
例如,如果将返回一些 JSON 数据
或者输出将完全通过 render() 函数处理(该模块扩展了 ShopControl::sendAdditionalHeaders()
)。
如何设置是否可缓存调用?
-
通过模块设置:有一些模块设置将被用于确定调用是否可缓存。
- FOUN10_SMART_PROXY_CACHEABLE_CONTROLLERS:您可以定义一个控制器(操作)类名数组,它将设置
x-sc-sp-cache: yes
,所有其他控制器都将设置x-sc-sp-cache: no
- FOUN10_SMART_PROXY_NON_CACHEABLE_PARAMETERS:您可以定义一个请求参数数组,它将设置
x-sc-sp-cache: no
- FOUN10_SMART_PROXY_CACHEABLE_CONTROLLERS:您可以定义一个控制器(操作)类名数组,它将设置
-
通过控制器逻辑:该模块将检查当前控制器是否有
isSmartProxyCachable()
函数。如果调用可缓存,则返回 true,否则返回 false。
更多信息可以在 foun10\SmartProxy\Core\SmartProxy::isCacheableCall()
函数中找到。
模板
如果您需要调整 HTML,可以使用以下条件来检查调用是否可缓存
[{if $oViewConf|method_exists:'isSmartProxyActive' && $oViewConf->isSmartProxyActive()}]
JS 逻辑
所有 JS 逻辑都可以在 modules/foun10/SmartProxy/out/js/foun10SmartProxy.js
中找到
替换
有一些逻辑可以在表单输入中用 cookie 值替换定义的占位符。如果值不可用,它们将从应用程序中获取。
从应用服务器获取
如果以下任一情况适用,将调用应用程序以设置 cookie
- 缺少强制 cookie
- 设置了“刷新”参数的 URL 参数
- 找到了需要的输入替换,但没有设置 cookie 值
事件
对于某些状态,将触发一些事件。您可以通过监听这些事件来添加一些自定义逻辑。
foun10SmartProxySetUpEnvironment
:将在最初触发,并确保所有强制 cookie 和所有用于替换的 cookie 值都存在foun10SmartProxyReplace
:如果cookie值存在并且触发替换,则会被触发foun10SmartProxyFetchDataComplete
:如果从远程获取完成,则会被触发foun10SmartProxyFetchData
:如果需要从远程获取,则会被触发
示例
在你的HTML中,有一个
标签,其中在可缓存的页面上显示购物车金额,它只是空的:<div class="cart-amount"></div>
要添加正确的购物车金额,可以使用(要求你已经设置了购物车金额的cookie逻辑)
window.addEventListener('foun10SmartProxyReplace', function (e) {
let basketAmount = e.detail.data.smartproxy_basket_amount || 0;
if (basketAmount !== 'empty' && basketAmount > 0) {
document.querySelector('.cart-amount').innerHTML = basketAmount;
}
}, false);
XHR检查
可能会在替换之前触发一些XHR请求。为了防止发送带有占位符的请求,对XMLHttpRequest.prototype
进行了扩展,以查找定义的占位符。如果找到占位符,则请求会被暂停,直到从应用程序获取替换数据。然后进行替换,并发送XHR请求。
调试
浏览器控制台中有一些调试信息,可以查看正在发生的事情。您可以使用模块选项FOUN10_SMART_PROXY_JS_DEBUG
启用/禁用这些信息
缓存标签
Smartproxy提供了为缓存的HTML分配缓存标签的能力。此模块已经处理了一些这些标签
- cl=xyc:xyz将被添加为缓存标签:例如,
xyz
- cl=details:(父)产品ID将被添加为缓存标签:例如,
details details-123456
- cl=alist:分类ID将被添加为缓存标签:例如,
alist alist-123456
- cl=content:内容ID将被添加为缓存标签:例如,
content content-123456
对此逻辑进行调整
请参阅modules/foun10/SmartProxy/Core/SmartProxyCacheTags.php
中的逻辑。您可以选择扩展给定的函数,或在您的(自定义)控制器中添加getSmartproxyCacheTags()
函数。getSmartproxyCacheTags()
需要返回一个包含您选择的缓存标签的数组。
缓存失效命令
有OXID控制台命令可以清除smartproxy缓存。
这两个命令都会触发rundeck作业,所以请确保FOUN10_SMART_PROXY_RUNDECK_JOB_HTML_CLEAR
和FOUN10_SMART_PROXY_RUNDECK_JOB_TAG_CLEAR
的配置值已经设置并可在您的rundeck实例上使用。
默认情况下,应该已经存在这些作业ID
FOUN10_SMART_PROXY_RUNDECK_JOB_HTML_CLEAR
:global-sc-rundeck-jobs-smartproxy-delete-html-cacheFOUN10_SMART_PROXY_RUNDECK_JOB_TAG_CLEAR
:Smartproxy_Tag_Cache_Clear_by_Filename
foun10:smartproxy:cache clear-html
使用此命令清除完整的smartproxy HTML缓存。例如,在部署后。
foun10:smartproxy:cache clear-tag --tag=XXX
使用此命令清除给定缓存标签的smartproxy HTML缓存。
已知问题/常见问题
跟踪
所有在可缓存的页面上实现且具有一些用户/会话定义数据的跟踪都应进行调整。提示:通常这些跟踪通常在不会默认缓存的感谢页面上。
例如,每个页面上当前购物车的跟踪
有一些逻辑可以从可缓存的页面上获取跟踪数据。您可以使用此逻辑获取所需的数据或设置cookie并从那里获取数据。
远程跟踪数据的示例
之前
_trboq.push([
"currentBasket",
{
value: 100,
product_ids: [
"abc",
"def"
]
}
]);
之后
[{if $oViewConf->isSmartProxyActive()}]
if (foun10SmartProxy.getCookie('smartproxy_basket_amount') > 0) {
foun10SmartProxy.getTrackingData('trbo_current_basket').then(function(data) {
_trboq.push([
"currentBasket",
data
]);
});
}
[{else}]
_trboq.push([
"currentBasket",
{
value: 100,
product_ids: [
"abc",
"def"
]
}
]);
[{/if}]
动态内容
在OXID中,您可以使用Smartyp标签[{oxid_include_dynamic file="..."}]
设置不应缓存的动态内容。目前Smartproxy没有能力像服务器端包含那样从应用程序服务器动态加载这些内容。
一个常见的例子是带有其值的迷你购物车。
您需要确保这些信息将以(异步)JavaScript的方式加载。