Статьи

Настройка кэширования в PHP с помощью компонента Symfony Cache

Сегодня я покажу вам компонент Symfony Cache, простой способ добавить кеширование в ваши PHP-приложения. Это помогает повысить общую производительность вашего приложения за счет сокращения времени загрузки страницы.

Компонент Symfony Cache позволяет настроить кэширование в ваших приложениях PHP. Сам компонент очень прост в установке и настройке и позволяет быстро приступить к работе. Кроме того, он предоставляет множество адаптеров на выбор, как показано в следующем списке:

  • адаптер базы данных
  • адаптер файловой системы
  • Memcached адаптер
  • Redis адаптер
  • Адаптер APCu
  • и более

Когда дело доходит до кэширования с использованием компонента Symfony Cache, есть несколько терминов, с которыми вы должны ознакомиться.

Начнем с того, что элемент кэша относится к содержимому, которое хранится. Каждый элемент хранится в виде пары ключ-значение. Элементы кэша управляются пулом кэша , который логически группирует их. Фактически, вам нужно использовать пул кеша для манипулирования значениями кеша. Наконец, это адаптер кеша, который выполняет всю тяжелую работу по хранению элементов в бэкэнде кэша .

В этой статье мы рассмотрим, как вы можете раскрыть всю мощь компонента Symfony Cache. Как обычно, мы начнем с установки и настройки, а затем продолжим исследовать несколько реальных примеров во второй половине статьи.

В этом разделе мы собираемся установить компонент Cache. Я предполагаю, что вы уже установили Composer в своей системе — он понадобится вам для установки компонента Cache, доступного в Packagist.

После того, как вы установили Composer, продолжайте и установите компонент Cache, используя следующую команду.

1
$composer require symfony/cache

Это должно было создать файл composer.json, который должен выглядеть следующим образом:

1
2
3
4
5
{
    «require»: {
        «symfony/cache»: «^4.1»
    }
}

Вот и все для установки, но как вы должны добавить его в свое приложение? Это просто вопрос включения файла autoload.php, созданного Composer, в ваше приложение, как показано в следующем фрагменте.

1
2
3
4
5
<?php
require_once ‘./vendor/autoload.php’;
 
// application code
?>

В этом разделе мы рассмотрим пример, который демонстрирует, как вы можете использовать компонент Cache в своих приложениях для кэширования контента.

Для начала давайте создадим файл index.php со следующим содержимым.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php
require_once ‘./vendor/autoload.php’;
 
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
 
// init cache pool of file system adapter
$cachePool = new FilesystemAdapter(», 0, «cache»);
 
// 1. store string values
$demoString = $cachePool->getItem(‘demo_string’);
if (!$demoString->isHit())
{
    $demoString->set(‘Hello World!’);
    $cachePool->save($demoString);
}
 
if ($cachePool->hasItem(‘demo_string’))
{
    $demoString = $cachePool->getItem(‘demo_string’);
    echo $demoString->get();
    echo «\n»;
}
 
// delete all items
$cachePool->clear();
 
if (!$cachePool->hasItem(‘demo_string’))
{
    echo «The cache entry demo_string was deleted successfully!\n»;
}
 
// 2. store array values
$demoOne = $cachePool->getItem(‘demo_array’);
if (!$demoOne->isHit())
{
    $demoOne->set(array(«one», «two», «three»));
    $cachePool->save($demoOne);
}
 
if ($cachePool->hasItem(‘demo_array’))
{
    $demoOne = $cachePool->getItem(‘demo_array’);
    var_dump($demoOne->get());
    echo «\n»;
}
 
// delete specific item
$cachePool->deleteItem(‘demo_array’);
 
if (!$cachePool->hasItem(‘demo_array’))
{
    echo «The cache entry demo_array was deleted successfully!\n»;
}
 
// 3. set expiry on items
$foo = $cachePool->getItem(‘foo’);
if (!$foo->isHit())
{
    $foo->set(‘bar’);
    $foo->expiresAfter(30);
    $cachePool->save($foo);
}
 
if ($cachePool->hasItem(‘foo’))
{
    $foo = $cachePool->getItem(‘foo’);
    echo $foo->get();
    echo «\n»;
}
sleep(60);
if ($cachePool->hasItem(‘foo’))
{
    $foo = $cachePool->getItem(‘foo’);
    echo $foo->get();
    echo «\n»;
}
else
{
    echo «Cache item was expired!\n»;
}

Давайте пройдемся по основным частям файла index.php, чтобы понять их назначение.

Как мы обсуждали ранее, кэшированные элементы хранятся в пуле кэша. Кроме того, каждый пул кеша поддерживается определенным бэкэндом кеша и адаптером. Например, если вы хотите хранить элементы в кэше файловой системы, вам нужно инициализировать пул кэша адаптера файловой системы.

1
$cachePool = new FilesystemAdapter(», 0, «cache»);

Вы можете предоставить три необязательных аргумента объекту FilesystemAdapter :

  • пространство имен, в котором вы хотите создать записи кэша
  • время жизни в секундах для элементов кэша
  • каталог, в котором будет храниться кеш.

Поскольку мы уже создали пул кеша, мы можем использовать его для хранения элементов кеша.

Во-первых, мы используем метод getItem для извлечения элемента кэша с ключом demo_string . Далее мы используем метод isHit чтобы проверить, присутствует ли isHit значение в элементе кеша $demoString .

1
2
3
4
5
6
$demoString = $cachePool->getItem(‘demo_string’);
if (!$demoString->isHit())
{
    $demoString->set(‘Hello World!’);
    $cachePool->save($demoString);
}

Поскольку мы впервые demo_string элемент кэша isHit метод isHit должен возвращать значение false . Далее мы используем метод $demoString объекта $demoString для установки значения кэша. Наконец, мы сохраняем $demoString кэша $demoString в $cachePool кэша $cachePool используя метод save .

Теперь, когда мы сохранили элемент в кэше, давайте посмотрим, как извлечь его из кэша.

1
2
3
4
5
6
if ($cachePool->hasItem(‘demo_string’))
{
    $demoString = $cachePool->getItem(‘demo_string’);
    echo $demoString->get();
    echo «\n»;
}

Здесь мы используем метод hasItem для проверки наличия элемента кэша в пуле кэша перед его извлечением.

Далее, давайте посмотрим, как удалить все элементы кеша из пула кеша:

1
$cachePool->clear();

В предыдущем разделе мы обсуждали, как хранить базовые значения в пуле кеша. Хранение значений массива во многом аналогично, как вы можете видеть в следующем примере.

01
02
03
04
05
06
07
08
09
10
11
12
13
$demoOne = $cachePool->getItem(‘demo_array’);
if (!$demoOne->isHit())
{
    $demoOne->set(array(«one», «two», «three»));
    $cachePool->save($demoOne);
}
 
if ($cachePool->hasItem(‘demo_array’))
{
    $demoOne = $cachePool->getItem(‘demo_array’);
    var_dump($demoOne->get());
    echo «\n»;
}

Как видите, мы можем просто установить элемент кэша со значением массива, точно так же, как мы сделали для строки.

Далее, давайте посмотрим, как удалить определенный элемент кэша из пула кэша.

1
$cachePool->deleteItem(‘demo_array’);

Здесь мы используем метод deleteItem для удаления элемента demo_array из пула кеша.

До сих пор мы кэшировали элементы в пул без даты истечения срока их действия. Однако обычно вы не хотите постоянно хранить элементы в кэше. Например, вы можете периодически обновлять элементы кэша, поэтому вам необходим механизм, который удаляет устаревшие элементы кэша.

В этом разделе мы обсудим, как хранить элементы в кэше вместе с датой истечения срока действия.

1
2
3
4
5
6
7
$foo = $cachePool->getItem(‘foo’);
if (!$foo->isHit())
{
    $foo->set(‘bar’);
    $foo->expiresAfter(30);
    $cachePool->save($foo);
}

Как видно из приведенного выше фрагмента, вы можете использовать метод expiresAfter чтобы установить дату истечения срока действия для кэшируемого элемента. В первом аргументе метода expiresAfter вы можете передать количество секунд, на которое вы хотели бы кэшировать элемент.

В нашем примере мы используем метод sleep чтобы проверить, доступен ли кэшированный элемент в пуле кэша.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
if ($cachePool->hasItem(‘foo’))
{
    $foo = $cachePool->getItem(‘foo’);
    echo $foo->get();
    echo «\n»;
}
sleep(60);
if ($cachePool->hasItem(‘foo’))
{
    $foo = $cachePool->getItem(‘foo’);
    echo $foo->get();
    echo «\n»;
}
else
{
    echo «Cache item was expired!\n»;
}

Идите и проверьте это, чтобы увидеть, как это работает!

Сегодня мы кратко рассмотрели компонент Symfony Cache, который позволяет вам настроить кэширование в ваших PHP-приложениях. Он также поддерживает различные адаптеры кэширования, которые вместе дают вам гибкость в выборе типа сервера, который вы хотите использовать.

Не стесняйтесь выражать свои мысли и вопросы, используя форму ниже.