今天,我将向您展示 symfony Cache 组件,这是一种将缓存添加到 php 应用程序的简单方法。这有助于通过减少页面加载时间来提高应用程序的整体性能。
Symfony 缓存组件
Symfony Cache 组件允许您在 PHP 应用程序中设置缓存。该组件本身非常易于安装和配置,让您可以快速上手。此外,它还提供了多种适配器可供选择,如下表所示:
当谈到使用 Symfony Cache 组件进行缓存时,您应该熟悉几个术语。
首先,缓存项是指存储的内容。每个项目都存储为一个键值对。缓存项由缓存池管理,缓存池对它们进行逻辑分组。实际上,您需要使用缓存池来操作缓存值。最后,缓存适配器完成了所有繁重的工作以将项目存储在缓存后端。
在本文中,我们将探讨如何释放 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 ?>
一个真实的例子
在本节中,我们将通过一个示例演示如何在应用程序中使用缓存组件来缓存内容。
首先,让我们继续创建包含以下内容的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. 接下来,我们使用对象的set方法$demoString来设置缓存值。最后,我们 使用该方法将$demoString缓存项保存到$cachePool缓存池中。save
现在我们已经将项目存储在缓存中,让我们看看如何从缓存中获取它。
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。
在我们的示例中,我们使用该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 Cache 组件,它允许您在 PHP 应用程序中设置缓存。它还支持各种缓存适配器,它们共同使您可以灵活地选择要使用的后端类型。
- 创建缓存池
- 如何存储字符串值
- 如何存储数组值
- 如何设置缓存项目的到期日期