valu/wp-graphql-cache

WPGraphQL 的灵活缓存框架

v0.1.0 2021-12-22 11:16 UTC

This package is auto-updated.

Last update: 2024-09-22 17:39:36 UTC


README

警告:这是一个 alpha 版本,功能尚未完善。

WPGraphQL Cache

适用于 WPGraphQL v0.9.0 或更高版本的灵活缓存框架

安装

composer require valu/wp-graphql-cache

或者,您可以通过使用稳定分支从 Github 克隆它到您的插件

cd wp-content/plugins
git clone --branch stable https://github.com/valu-digital/wp-graphql-cache.git

查询缓存

如果您只想开始缓存一段时间内的所有查询,您只需将其添加到主题的 functions.php 或 mu-plugin

use WPGraphQL\Extensions\Cache\CacheManager;

CacheManager::register_graphql_query_cache([
    'query_name' => '*',
    'expire' => 120, // sec
]);

或者您也可以针对特定的查询

use WPGraphQL\Extensions\Cache\CacheManager;

CacheManager::register_graphql_query_cache([
    'query_name' => 'MySlowQuery',
    'expire' => 120,
]);

字段缓存

假设您有一个大型查询,它获取各种内容,其中大多数都相当快,但其中一个太慢。您可以使用 register_graphql_field_cache() 针对那个单独的根字段。

use WPGraphQL\Extensions\Cache\CacheManager;

CacheManager::register_graphql_field_cache([
    'query_name' => 'MyBigQuery',
    'field_name' => 'menuItems',
    'expire' => 120, // sec
]);

这将开始缓存名为 MyBigQuery 的 GraphQL 查询上的 menuItems 根字段,持续时间为 120 秒。

区域缓存控制

您可以使用 CacheManager::clear() 清除所有 GraphQL 缓存,但如果您想要更具体地清除缓存,则必须将 zone 属性传递给 register_graphql_query_cacheregister_graphql_field_cache,然后您可以使用 CacheManager::clear_zone($zone) 清除该区域。

区域是一个缓存区域,缓存将存储到该区域。需要区域是因为缓存响应被写入多个缓存密钥,因为 GraphQL 变量和当前用户可以在同一查询的调用之间更改

您可以使用 CacheManager::clear_zone() 清除区域。

/**
 * Register cache to a 'menus' zone
 */
CacheManager::register_graphql_field_cache([
    'zone' => 'menus', // 👈
    'query_name' => 'MyBigQuery',
    'field_name' => 'menuItems',
    'expire' => 120, // sec
]);

/**
 * Clear the zone 'menus' when the menus are updated
 */
add_action('wp_update_nav_menu', function () {
    CacheManager::clear_zone('menus');
});

您还可以在多个缓存之间共享相同的区域。

WP CLI

您也可以使用 WP CLI 清除区域。

$ wp graphql-cache clear # clear all zones
$ wp graphql-cache clear --zone=menus

性能测量

WPGraphQL Cache 配备了一个非常简单的构建查询性能工具,该工具会在 /graphql 响应中添加一个 x-graphql-duration 标头。它包含实际的 GraphQL 响应 解析 的时间(以毫秒为单位)。当缓存未命中时,这是此插件可以从响应时间中提取的理论最大值。其余时间都花费在在 GraphQL 解析器执行之前设置 WP 和 WPGraphQL 本身。

如果您想超越这个,您可以在 WPGraphQL Lock 插件中启用带有持久查询的 GET 请求,并在边缘服务器(nginx、varnish、CDN 等)中缓存整个响应。这将是一个性能最佳的缓存,因为缓存命中时根本不会调用 PHP 解释器。

存储后端

有几个存储后端可供选择,可以使用 graphql_cache_backend 过滤器进行配置。

use WPGraphQL\Extensions\Cache\Backend\FileSystem;

add_filter('graphql_cache_backend', function () {
    return new FileSystem( [
        'base_directory'        => '/custom/path',
        'directory_permissions' => '0770',
        'file_permissions'      => '0660',
    ] );
});

文件系统

这是默认后端,将缓存写入 /tmp/wp-graphql-cache。它不是超级快,但如果有 RAM 磁盘作为后盾,它也可以合理地执行。

暂存

这是一个缓存存储后端,它将缓存写入 WordPress 暂存。

这是一个灵活的缓存存储后端,因为真正的存储可以在平台级别通过使用对象缓存进行配置。默认情况下,如果没有定义对象缓存,WordPress 将将暂存作为选项存储在数据库中。

例如,单个服务器环境可能使用APC对象缓存,而高可用性(HA)环境可能使用Memcached或Redis后端。

OPCache

待办事项

自定义后端

只要自定义后端扩展自\WPGraphQL\Extensions\Cache\Backend\AbstractBackend,它也可以被返回。