个性化阅读
专注于IT技术分析

如何在Symfony 3中为Guzzle创建PSR-6文件系统缓存

本文概述

缓存组件在服务器端和客户端中总是有用的。有时, 当你在服务器端使用PHP并使用Symfony框架时, 你将需要从你自己的服务器中的另一台服务器请求信息。 Guzzle是可扩展的PHP HTTP客户端, 是使用PHP向Web API请求信息的最常用的库之一, 因为它可以轻松发送HTTP请求, 并且易于与Web服务集成。

如果你尝试访问的Web服务由于请求的限制而要求你实现缓存, 那么你始终可以为Guzzle Client实现缓存, 这样就永远不会收到429 Too Many Requests异常在你的代码中。如上所述, 这可以完成, 因为你正在使用的API需要它, 或者仅仅是因为你想加快服务器中的请求(通常, 服务应该已经实现了缓存)。在本文中, 你将学习如何在PSR-6接口之后为Guzzle实现基于文件系统的缓存。此PSR的目标是允许开发人员创建可感知缓存的库, 这些库可以集成到现有框架和系统中, 而无需进行自定义开发。

文件系统缓存如何工作?

通过使用我们将使用文件系统而不是普通客户端实现的Guzzle缓存客户端, 将在symfony项目的缓存目录中创建一个新文件夹(在这种情况下, 新文件夹的名称将为GuzzleFileCache, 因此该文件夹将位于yoursymfonyproject / var / cache / GuzzleFileCache)。该客户端可以用作任何普通的Guzzle Http客户端。

重要

不要忘记给予适当的写入文件夹的权限(至少在生产环境中, 如果要部署到服务器)。

实现

要实现基于文件的缓存客户端, 你可以按照以下两个简单步骤操作:

1.安装缓存库

除了Guzzle(显然)之外, 你还需要安装Symfony缓存组件和Guzzle缓存中间件库。 Symfony的缓存组件提供了扩展的PSR-6实现以及PSR-16″简单缓存”实现, 用于向你的应用程序添加缓存。它被设计为具有较低的开销, 并且随附了可用于最常见的缓存后端的适配器。 Guzzle的缓存中间件通过在生成响应的过程中调用处理程序来增强处理程序的功能。

要安装所需的库, 请使用终端在项目目录中运行以下composer命令:

REM Install the Cache Component of Symfony:
composer require symfony/cache

REM And install the Cache Middleware for Guzzle:
composer require kevinrob/guzzle-cache-middleware

安装这两个库之后, 你将能够在自己的控制器(或服务)中使用它们的类。

2.创建一个缓存的客户端实例

客户端的用法应与往常相同, 所改变的是创建和实例化客户端的过程。通过将所有内容包装到一个函数即getGuzzleFileCachedClient中, 我们使逻辑变得简单, 该函数返回实现基于文件的缓存的HTTP客户端的实例。

首先, 你需要知道将使用哪些库类:

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Storage\Psr6CacheStorage;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Kevinrob\GuzzleCache\Strategy\GreedyCacheStrategy;

我们将使用的高速缓存存储将是带有PSR-6的文件系统, 因此你需要首先创建它的一个实例, 该实例接收FilesystemAdapter的实例作为第一个参数。 FilesystemAdapter的此实例指定缓存的TTL, 其容器名称和绝对路径。 TTL(或生存时间)是指从存储该项目到将其视为过期之间的时间。 TTL通常由代表时间(以秒为单位)的整数或DateInterval对象定义。这个时间在FilesystemAdapter和GreedyCacheStrategy中提供。

然后, 你可以使用空HandlerStack的push方法将Cache方法添加到Guzzle, 该方法将Cache Middleware实例作为第一个参数, 并将greedy-cache方法作为第二个参数, 而greedy-cache方法又将第一个参数接收GreedyCacheStrategy。最后一个实例接收文件缓存存储和TTL的创建实例作为第一个参数:

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

// Required Classes to create the client
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use Kevinrob\GuzzleCache\CacheMiddleware;
use Kevinrob\GuzzleCache\Storage\Psr6CacheStorage;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Kevinrob\GuzzleCache\Strategy\PrivateCacheStrategy;
use Kevinrob\GuzzleCache\Strategy\GreedyCacheStrategy;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        // Create a Custom Cached Guzzle Client
        $client = $this->getGuzzleFileCachedClient();
        

        // Use the client as you want and need, for example:
        $res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle');
        dump($res->getStatusCode());
    }


    /**
    * Returns a GuzzleClient that uses a file based cache manager
    *
    * @return Guzzle Http Client
    */
    private function getGuzzleFileCachedClient(){
        // Create a HandlerStack
        $stack = HandlerStack::create();

        // 10 minutes to keep the cache
        // This value will obviously change as you need
        $TTL = 600;

        // Create Folder GuzzleFileCache inside the providen cache folder path
        $requestCacheFolderName = 'GuzzleFileCache';

        // Retrieve the cache folder path of your Symfony Project
        $cacheFolderPath = $this->get('kernel')->getRootDir() . '/../var/cache'; 
        
        // Instantiate the cache storage: a PSR-6 file system cache with 
        // a default lifetime of 10 minutes (60 seconds).
        $cache_storage = new Psr6CacheStorage(
            new FilesystemAdapter(
                $requestCacheFolderName, $TTL, $cacheFolderPath
            )
        );
        
        // Add Cache Method
        $stack->push(
            new CacheMiddleware(
                new GreedyCacheStrategy(
                    $cache_storage, $TTL // the TTL in seconds
                )
            ), 'greedy-cache'
        );
        
        // Initialize the client with the handler option and return it
        return new Client(['handler' => $stack]);
    }
}

显然, 要使控制器尽可能的薄, 你可以创建一个新的symfony服务来注入缓存的客户端。客户端的用法将在给定名称的项目的var / cache文件夹中创建一个文件夹:

基于高速缓存文件

它会包含(一旦执行一些请求)在PSR-6中缓存的请求。作为每个高速缓存, 删除文件夹的内容(或文件夹本身)将清除高速缓存, 或者在TTL过期时自行清除。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 3中为Guzzle创建PSR-6文件系统缓存

评论 抢沙发

评论前必须登录!