【问题标题】:How can I transform my YAML file in a PHP one?如何将我的 YAML 文件转换为 PHP 文件?
【发布时间】:2014-04-14 13:00:11
【问题描述】:

我正在使用 Symfony 2.3.x 来实现一个项目。这涉及在 2 个配置文件中拥有 2 个巨大的键 -> 值对列表。

目前,这些是作为 YAML 文件实现的,它们看起来像这样:

parameters:
    values:
        part1:
            key1: value1
            key2: value2
            key3: value3
            key4: value4
            key5: value5
            key6: value6
        part2:
            key1: value1
            key2: value2
            key3: value3
            key4: value4
            key5: value5
            key6: value6

map:
    key1: ['value']
    key2: ['value1', 'value2']
    key3: ['value1', 'value2', 'value3']
    key4: ['value']
    key5: ['value1', 'value2', 'value3']
    key6: ['value']

(第一个中的值被传递给一个类的构造函数,这就是它的值在parameters根节点下的原因)

Symfony\Component\HttpKernel\DependencyInjection\Extension 实现中,它们的加载方式如下(相当标准):

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/folder'));
$loader->load('myfile.yml');
$loader->load('myfile2.yml');

一切正常,但这些文件很大(每个文件有几千行)并且会导致一些性能问题。我不坚持使用 YAML,所以我认为一个好的性能提升是完全跳过 YAML 解析部分并将这些值直接作为 PHP 数组。这可能会为我节省一些宝贵的时间。

问题是我不知道如何在 PHP 文件中转换它们。那些 PHP 数组应该是什么样子的? Symfony 如何读取该文件并获得对这些数组的访问权限?

我搜索了 Symfony 的文档,但基本上都是关于以 YAML 格式编写内容的。我只能找到这个:

parameters:
    key: value

可以写成:

$container->setParameter('key', 'value');

但这里有一些问题:

  • 没有关于$container 来自哪里的说明
  • 当你有几千个参数时,调用setParameter 几千次似乎真的要慢得多
  • 如果数组中有数组中的数组,那么如何调用该函数?

如何将我的 YAML 文件转换为 PHP 文件?

提前谢谢你:)。

【问题讨论】:

  • 你考虑过缓存它们吗?那可能更容易。所以在开发中,你使用 yaml 文件,在生产/测试中你缓存它们。
  • 您可以在单个 setParameter 调用中提供一个大的嵌套数组作为值。 $container 变量是预定义的。但我不认为你应该有这么多的数据作为参数。
  • @AndreschSerj 现在,该项目正在开发中,速度慢得令人无法接受。是的,这些文件在生产中被缓存,但我想确保在它进入生产阶段之前没有严重的性能问题......

标签: php performance symfony configuration-files


【解决方案1】:

解析文件并没有真正为您赢得太多时间。当你在开发环境中不更改容器时,一切都会正常缓存,你不会有任何问题。

此外,如果您有几千行参数,您可能会做一些完全错误的事情。参数真的是你想要的吗?我认为为他们使用数据库可能会好很多。


如果你真的想这样做:

没有关于 $container 来自哪里的规范

这不是您必须担心的事情。它来自 PHP 文件加载器。您不必在文件中包含定义。

当你有几千个参数时,调用 setParameter 几千次似乎真的要慢得多

我想是的。

如果数组中有数组中的数组,那么如何调用该函数?

只需使用关联数组作为setParameter() 的参数。

【讨论】:

  • 看我的回答。我决定将它们存储在内存缓存中,否则太痛苦了。谢谢你的回答:)。
【解决方案2】:

我通过完全绕过性能问题解决了这个问题。我只是将解析后的文件存储在 memcache 中(具有很大的 TTL)并从那里访问它们。现在一切正常。

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 2012-08-13
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多