Caching 将从YAML文件解析的PHP数组存储在Symfony';s缓存

Caching 将从YAML文件解析的PHP数组存储在Symfony';s缓存,caching,symfony,yaml,Caching,Symfony,Yaml,我有几个YAML文件要从服务中解析 但在每次点击页面时,这些YAML文件都会被解析并转换为PHP数组。我知道Symfony会缓存默认的YAML文件,所以它不会在每次点击页面时解析每个YAML文件 我想知道这里的最佳做法是什么。有没有办法让我的YAML文件只解析一次并存储在Symfony2的缓存中?如果是这样的话,请给我指出正确的方向好吗?这完全取决于您希望如何进行缓存 HTTP缓存只有在web上下文中以及解析这些文件并将其添加到数组中的操作的特定输出相对静态时才有意义。如果这两个条件都满足,那

我有几个YAML文件要从服务中解析

但在每次点击页面时,这些YAML文件都会被解析并转换为PHP数组。我知道Symfony会缓存默认的YAML文件,所以它不会在每次点击页面时解析每个YAML文件


我想知道这里的最佳做法是什么。有没有办法让我的YAML文件只解析一次并存储在Symfony2的缓存中?如果是这样的话,请给我指出正确的方向好吗?

这完全取决于您希望如何进行缓存

  • HTTP缓存只有在web上下文中以及解析这些文件并将其添加到数组中的操作的特定输出相对静态时才有意义。如果这两个条件都满足,那么这就是最好的办法

  • 您可以轻松使用APC进行缓存。它使缓存变量的内容变得非常简单。条令提供了一个围绕APC的缓存抽象,或者您可以使用本机PHP函数

在config.yml中

 services:
        cache:
            class: Doctrine\Common\Cache\ApcCache
然后在控制器或服务中:

if ($yamlArray = $this->get('cache')->fetch('foo')) {
    $yamlArray = unserialize($yamlArray);
} else {
    // do the work
    $this->get('cache')->save('foo', serialize($yamlArray));
}
  • 创建自己的缓存服务并将其挂接到Symfony缓存命令中


(添加但没有很好的文档记录)。

我对它不太了解,但是关于JmsSerializer(和JmsSerializerBundle)呢?不确定您是否可以以某种方式利用Symfony2的缓存系统,但您肯定可以使用来自捆绑包(如SonatacheBundle)的服务来存储解析的数据。我可以序列化我的阵列,但我不知道如何将它们存储在缓存中并加载它们。此外,SonatacheBundle似乎没有很好的文档记录。我会查出来的。这些不是我试图缓存的模板,它们是YAML文件,不是细枝文件。无论如何,APC缓存的原则似乎适用。我将从磁盘加载YAML文件,解析它,序列化阵列,将其存储在APC缓存中。。。但是如何检查序列化版本是否过时(或者YAML配置已更改,需要重新加载/重新解析)?我会将文件的crc与序列化数组一起存储吗?它在生产环境中不是有点慢吗?我很想运行cache:clear--env=prod并在生产环境中重新构建它:(我更新了我的答案,以解决您询问的关于YAML而不是Twig的问题,(周一让我的眼睛明显地交叉了).Re:但是如何检查序列化版本是否过期,您可以将对象与
md5_文件()或
crc32()
一起存储在缓存中。例如,
$this->get('cache')->save('foo_'.md5_文件($file),$yamlaray)
,然后使用
$this->get('cache')->fetch('foo_'.md5_文件($file))
获取时。存储@theunraveler提到的散列绝对是最简单的方法。让散列算法为您完成这项工作。