Как создать кэш файловой системы PSR-6 для Guzzle в Symfony 3

Компонент кэша всегда полезен как на стороне сервера, так и на стороне клиента. Иногда, когда вы работаете на стороне сервера с PHP и используете Symfony Framework, вам потребуется запросить информацию с другого сервера на вашем собственном сервере. Guzzle, расширяемый PHP-HTTP-клиент, является одной из наиболее часто используемых библиотек для запроса информации у веб-API с помощью PHP, поскольку он упрощает отправку HTTP-запросов и упрощает интеграцию с веб-службами.

Если веб-служба, к которой вы пытаетесь получить доступ, требует, чтобы вы внедрили кеш, из-за ограничения количества запросов вы всегда можете реализовать кеш для клиента Guzzle, поэтому вы никогда не получите 429 Слишком много запросов исключение в вашем коде. Это может быть сделано, как уже упоминалось, потому что API, который вы используете, требует этого или просто потому, что вы хотите ускорить запросы на вашем сервере (как правило, служба уже должна реализовывать кэш). В этой статье вы узнаете, как реализовать кэш на основе файловой системы для Guzzle, следуя интерфейсу PSR-6. Цель этого PSR состоит в том, чтобы позволить разработчикам создавать библиотеки с поддержкой кэширования, которые могут быть интегрированы в существующие платформы и системы без необходимости пользовательской разработки.

Как работает кеш файловой системы?

Используя Cached Client of Guzzle, который мы собираемся реализовать, используя файловую систему вместо простого клиента, в каталоге cache вашего проекта symfony будет создана новая папка (в этом случае имя нашей новой папки будет GuzzleFileCacheпоэтому папка будет расположена по адресу yoursymfonyproject/var/cache/GuzzleFileCache). Клиент может использоваться как любой нормальный клиент Guzzle Http.

Важный

Не забудьте правильно дать разрешения на запись в папку (по крайней мере, в производственной среде на случай, если вы внедряете на свой сервер).

Реализация

Чтобы реализовать клиент для файлового кэша, вы можете выполнить 2 простых шага:

1. Установите кеш-библиотеки

Помимо Guzzle (очевидно) вам нужно будет установить компонент Symfony Cache и Промежуточное программное обеспечение Guzzle Cache библиотеки. Компонент Cache Symfony предоставляет расширенную реализацию PSR-6, а также реализацию «Simple Cache» PSR-16 для добавления кеша в ваши приложения. Он разработан с минимальными накладными расходами и поставляется с готовыми к использованию адаптерами для самых распространенных бэкэндов кэширования. Cache Middleware of 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-х библиотек вы сможете использовать их классы в вашем собственном контроллере (или сервисах).

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 объект. Это время представлено в FileystemAdapter и GreedyCacheStrategy.

Затем вы можете добавить метод Cache к Guzzle, используя метод push пустого HandlerStack, который получает в качестве первого аргумента экземпляр промежуточного программного обеспечения Cache, а в качестве второго аргумента — метод greedy-cache, который, в свою очередь, получает в качестве первого аргумента экземпляр GreedyCacheStrategy. Этот последний экземпляр получает в качестве первого аргумента созданный экземпляр File Cache Storage и TTL:

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.

Ссылка на основную публикацию
Adblock
detector