【问题标题】:Storing a PHP Array parsed from a YAML file in Symfony's cache在 Symfony 的缓存中存储从 YAML 文件解析的 PHP 数组
【发布时间】:2013-03-30 23:02:54
【问题描述】:

我有一些 YAML 文件要从服务中解析。

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

我想知道这里的最佳做法是什么。有没有办法让我的 YAML 文件只解析一次并与 Symfony2 的缓存一起存储?如果是这样,我能否指出正确的方向?

【问题讨论】:

  • 我对此了解不多,但是JmsSerializer(和JmsSerializerBundle)呢?
  • 不确定你是否能以某种方式利用 Symfony2 的缓存系统,但你绝对可以使用像 SonataCacheBundle 这样的捆绑包中的服务来存储解析的数据。
  • 我可以序列化我的数组,但我不确定如何将它们存储在缓存中并加载它们。此外, SonataCacheBundle 似乎没有很好的文档记录。我去看看。

标签: caching symfony yaml


【解决方案1】:

这完全取决于您要如何进行缓存。

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

  • 您可以轻松地使用 APC 进行缓存。它使缓存变量的内容变得非常简单。 Doctrine 提供了围绕 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 缓存命令中

Details on creating a cache warmer

Details on cache_clearer(已添加但未充分记录)。

【讨论】:

  • 那些不是我要缓存的模板,它们是 YAML 文件,而不是 TWIG 文件。无论如何,APC 缓存的原则似乎适用。我会从磁盘加载 YAML 文件,解析它,序列化数组,将它存储在 APC 缓存中......但是我如何检查序列化版本是否已过时(或者,YAML 配置已更改并且需要重新加载/重新解析)?我会将文件的 crc 与序列化数组或其他内容一起存储吗?生产环境会不会有点慢?我很想运行 cache:clear --env=prod 并在生产环境中重建它:(
  • 我已经更新了我的答案,以解决你问的是 YAML 而不是 Twig 的事实,(星期一让我的眼睛很明显)。
  • Re: 但是如何检查序列化版本是否过时,您可以将对象与md5_file()crc32() 一起存储在缓存中。比如$this->get('cache')->save('foo_' . md5_file($file), $yamlArray),那么抓取的时候使用$this->get('cache')->fetch('foo_' . md5_file($file))
  • 像@theunraveler 提到的那样存储哈希绝对是最简单的方法。让哈希算法为您完成工作。
猜你喜欢
  • 2016-08-10
  • 1970-01-01
  • 2016-07-30
  • 2011-05-12
  • 2020-07-26
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多