foun10/smartproxy

安装数: 2,143

依赖者: 0

建议者: 0

安全: 0

星标: 2

关注者: 3

分支: 0

开放性问题: 0

类型:oxideshop-module

1.0.2 2023-11-10 12:43 UTC

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。您可以设置其值是否为 yesno 的逻辑。

注意:该模块仅在控制器逻辑使用时设置此 HTTP 头。

$header = oxNew(\OxidEsales\Eshop\Core\Header::class);
$header->sendHeader();

例如,如果将返回一些 JSON 数据

或者输出将完全通过 render() 函数处理(该模块扩展了 ShopControl::sendAdditionalHeaders())。

如何设置是否可缓存调用?

  1. 通过模块设置:有一些模块设置将被用于确定调用是否可缓存。

    • 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
  2. 通过控制器逻辑:该模块将检查当前控制器是否有 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_CLEARFOUN10_SMART_PROXY_RUNDECK_JOB_TAG_CLEAR的配置值已经设置并可在您的rundeck实例上使用。

默认情况下,应该已经存在这些作业ID

  • FOUN10_SMART_PROXY_RUNDECK_JOB_HTML_CLEAR:global-sc-rundeck-jobs-smartproxy-delete-html-cache
  • FOUN10_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的方式加载。