今天,我将向您展示Symfony缓存组件,这是一种向PHP应用程序添加缓存的简便方法。 通过减少页面加载时间,这有助于提高应用程序的整体性能。
Symfony缓存组件
Symfony缓存组件使您可以在PHP应用程序中设置缓存。 该组件本身非常易于安装和配置,可让您快速入门。 此外,它提供了多种适配器供您选择,如下表所示:
- 数据库适配器
- 文件系统适配器
- 内存缓存适配器
- Redis适配器
- APCu适配器
- 和更多
在使用Symfony缓存组件进行缓存时,您需要熟悉一些术语。
首先, 缓存项是指存储的内容。 每个项目都存储为键值对。 高速缓存项由高速缓存池管理,该高速缓存池对其进行逻辑分组。 实际上,您需要使用缓存池来操作缓存值。 最后,由缓存适配器完成所有繁重的工作以将项目存储在缓存后端中 。
在本文中,我们将探讨如何释放Symfony Cache组件的功能。 与往常一样,我们将从安装和配置开始,然后在本文的后半部分继续探讨一些实际示例。
安装与配置
在本节中,我们将安装Cache组件。 我假设您已经在系统中安装了Composer,将需要它来安装Packagist上可用的Cache组件。
安装Composer后,请继续并使用以下命令安装Cache组件。
$composer require symfony/cache
那应该已经创建了一个composer.json文件,看起来应该像这样:
{
"require": {
"symfony/cache": "^4.1"
}
}
安装即已完成,但是应该如何将其添加到应用程序中呢? 只需在应用程序中包含由Composer创建的autoload.php文件即可,如以下代码片段所示。
<?php
require_once './vendor/autoload.php';
// application code
?>
真实的例子
在本节中,我们将通过一个示例演示如何在应用程序中使用Cache组件来缓存内容。
首先,让我们继续创建具有以下内容的index.php文件。
<?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文件的主要部分以了解它们的用途。
创建缓存池
如前所述,缓存的项目存储在缓存池中。 此外,每个缓存池均由特定的缓存后端和适配器支持。 例如,如果要将项目存储在文件系统缓存中,则需要初始化文件系统适配器的缓存池。
$cachePool = new FilesystemAdapter('', 0, "cache");
您可以为FilesystemAdapter
对象提供三个可选参数:
- 您要在其中创建缓存条目的名称空间
- 缓存项的生存时间(以秒为单位)
- 将在其中存储缓存的目录。
如何存储字符串值
由于我们已经创建了缓存池,因此可以使用它来存储缓存项。
首先,我们使用getItem
方法通过demo_string
键获取缓存项。 接下来,我们使用isHit
方法检查要查找的值是否已存在于缓存项$demoString
。
$demoString = $cachePool->getItem('demo_string');
if (!$demoString->isHit())
{
$demoString->set('Hello World!');
$cachePool->save($demoString);
}
由于这是我们第一次获取demo_string
缓存项,因此isHit
方法应返回false
。 接下来,我们使用$demoString
对象的set
方法设置缓存值。 最后,我们使用save
方法将$demoString
缓存项保存到$cachePool
缓存池中。
现在,我们已将项目存储在缓存中,让我们看看如何从缓存中获取它。
if ($cachePool->hasItem('demo_string'))
{
$demoString = $cachePool->getItem('demo_string');
echo $demoString->get();
echo "\n";
}
在这里,我们使用hasItem
方法在检索缓存池中的缓存项之前对其进行检查。
接下来,让我们看看如何从缓存池中删除所有缓存项:
$cachePool->clear();
如何存储数组值
在上一节中,我们讨论了如何在缓存池中存储基本值。 如下面的示例所示,存储数组值几乎相同。
$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";
}
如您所见,我们可以简单地将缓存项设置为数组值,就像我们对字符串所做的一样。
接下来,让我们看看如何从缓存池中删除特定的缓存项。
$cachePool->deleteItem('demo_array');
在这里,我们使用deleteItem
方法从缓存池中删除demo_array
项目。
如何设置缓存项的到期日期
到目前为止,我们已经将项目缓存到池中,没有到期日期。 但是,您通常不希望将项目永久存储在缓存中。 例如,您可能想定期刷新缓存项,因此需要一种机制来清除过期的缓存项。
在本节中,我们将讨论如何在缓存中存储项目以及到期日期。
$foo = $cachePool->getItem('foo');
if (!$foo->isHit())
{
$foo->set('bar');
$foo->expiresAfter(30);
$cachePool->save($foo);
}
如您在上面的代码段中所见,可以使用expiresAfter
方法设置缓存项的到期日期。 您可以在expiresAfter
方法的第一个参数中传递要缓存项目的expiresAfter
。
在我们的示例中,我们使用sleep
方法测试高速缓存池中高速缓存的项目是否仍然可用。
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缓存组件,该组件使您可以在PHP应用程序中设置缓存。 它还支持各种缓存适配器,这些缓存适配器一起使您可以灵活地选择要使用的后端类型。
请使用以下表格随意表达您的想法和疑问。