Nat*_*one 6 php yaml symfony doctrine-orm
如下面的Webgrind输出所示,我的应用程序将大部分处理时间花在YAML解析上.

注意:Webgrind输出为"百分比".因此,将"总自我成本"加起来显示用于处理YAML的总时间的83.63%.
我见过这个相关的帖子:
但是,我的实现是使用ApcClassLoader类,如下所示:
$loader = new ApcClassLoader('odr_dev', $loader);
$loader->register(true);
Run Code Online (Sandbox Code Playgroud)
另外,我已经使用apc.php检查了APC系统,我的类和页面都在APC缓存中找到并且正在被命中.即使在填充了缓存之后,这也会在任何请求上在PROD或DEV上发生.
我的理论是我们有一个循环实体引用,系统无法成功解析YAML以便缓存它.因此,它最终会尝试在每个请求上解析YAML.
不过,我没有看到任何错误有关无法解析YAML或任何在日志和我不能确定如何确定这可能是情况或者旁边看.
在逐步完成此过程中涉及的每一行代码后,我发现 Doctrine 使用的是默认的“数组”缓存,该缓存仅对单页加载有效。
我想我自己和许多其他人都认为当我们打开 APC 时,Doctrine 也会使用它来进行元数据缓存。事实上,除非另有说明,Doctrine 默认使用其数组缓存。
此页面列出了 Doctrine 配置选项:
http://symfony.com/doc/2.3/reference/configuration/doctrine.html
添加缓存驱动选项后,我的/app/config/config.yml如下所示:
doctrine:
dbal:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
result_cache_driver:
type: memcached
host: 127.0.0.1
port: 11211
instance_class: Memcached
metadata_cache_driver:
type: memcached
host: 127.0.0.1
port: 11211
instance_class: Memcached
query_cache_driver:
type: memcached
host: 127.0.0.1
port: 11211
instance_class: Memcached
Run Code Online (Sandbox Code Playgroud)
修复后,同一页面没有显示YAML 解析器交互,加载时间为 302 毫秒,而加载时间为 5851 毫秒,总加速速度提高了 19 倍。此外,cachegrind 文件从 121MB 增加到 3.4MB,这些结果在多次试验中基本一致。
这是显示差异的同一个 Webgrind:

所以,基本上,这是一个配置问题。从我在 StackOverflow 问题和其他论坛中看到的情况来看,缓存的工作原理似乎存在脱节。本质上,您需要明确地打开它以进行上面概述的 Doctrine 缓存,否则它会使用基本上无用的默认值。
Symfony2 有时可能过于“可配置”,这是我从未想到过它可以单独配置的一个例子。从这方面来说,它是一个强大的功能(能够对事物使用单独的缓存),但在您弄清楚这一点之前,就速度而言,系统完全受到损害。
| 归档时间: |
|
| 查看次数: |
678 次 |
| 最近记录: |