尝试理解和实现Symfony 3框架和Doctrine的缓存

11

我们有一个基于Symfony 3.2(当时从Symfony 2.3开始)和Doctrine ORM 2.5的正在运行的应用程序,事情的发展非常棒。

我读了很多关于新的Symfony缓存组件,APC和APCU的优势和不足,opcache,在Symfony中为缓存提出请求等内容...但说实话这一次你让我有些摸不着头脑。

所以我恳请是否可以有人在以下两个方面支持我:1)理解和2)在生产环境中实现"标准"Symfony / Doctrine应用程序的缓存。

前提/假设

1)opcache应该启用并激活,并且缓存任何与字节码相关的内容。

2)我目前没有任何需要缓存自己应用程序的要求。这全部都是关于框架缓存,例如注释、类映射、验证、ORM元数据等。

3)大多数开发人员不想处理超过一个缓存提供程序,无论是APCu、xcache、redis、memcache还是其他任何东西。可能有非常好的理由为不同的任务使用不同的缓存提供程序,但让我们坚持只使用一个以保持简单。

"标准"Symfony / Doctrine应用程序在生产模式下的缓存选项

1)类加载

我们仍然在app.php中使用ApcClassLoader:

$loader = require __DIR__ . '/../app/autoload.php';
include_once __DIR__ . '/../var/bootstrap.php.cache';

$apcLoader = new ApcClassLoader('arcsf2', $loader);
$apcLoader->register(true);
$loader->unregister();

require_once __DIR__ . '/../app/AppCache.php';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$kernel = new AppCache($kernel);

据我所知,Symfony仅提供了两种选项:ApcClassLoader和XcacheClassLoader。因此,这可能会与上面的假设2产生矛盾。

问题:

现在是否仍然需要/必需/表现显著更好地使用这些缓存ClassLoader?

还是现在使用标准的app.php已足够?

$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../var/bootstrap.php.cache';

$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();

2) 验证缓存

我们仍然在我们的 config_prod.yml 文件中保留了这个:

framework:
validation:
    cache: validator.mapping.cache.doctrine.apc

问题:

说实话,我不知道在Symfony 3.2和新的缓存组件中是否仍然有效。如果需要,我该如何将其更改为不同的缓存提供程序?如何使其适应Symfony 3.2 Cache的最新版本?

3)Doctrine缓存:

对于config_prod.yml中的doctrine orm部分,几乎可以应用同样的问题:

doctrine:
orm:
    metadata_cache_driver: apc
    result_cache_driver: apc
    query_cache_driver: apc
< p >< em >问题:

这还是现在应该使用的方式吗?如何改变这个方式,使用新的Symfony缓存组件 - 无论如何都可以吗?

4) 新选项?

如何处理config_prod.yml中的新选项?

framework:
cache:
    app: cache.adapter.someProviderOrPool
    system: cache.adapter.someProviderOrPool

问题:

这里缓存了什么样的信息,由谁缓存的,它是否在某种程度上替代或扩展了上述某些主题?

总之:

我想基本上更改所有我的生产配置,以符合Symfony 3.2,并且我想在尽可能多的地方使用Redis进行缓存(替换APC),但我完全不知道如何开始和从哪里开始。

****编辑****

在这种情况下,Symfony Cache组件和DoctrineCacheBundle如何配合?替换?添加?构建?共同工作?冲突?不可比较?


1
为什么要踩我?或者至少能否让踩我的人简短地评论一下如何改进这个问题? - LBA
1个回答

4

编辑:此处的所有内容已合并到Symfony的官方文档中。 您可能需要查看最新的文档

使用OPcache字节码缓存

OPcache将编译过的PHP文件存储起来,避免为每个请求重新编译它们。有一些字节码缓存可用,但是从PHP 5.5开始,PHP内置了OPcache。对于旧版本,最常用的字节码缓存是APC。

配置OPcache以获得最佳性能

默认的OPcache配置不适用于Symfony应用程序,因此建议按以下方式更改这些设置:

; php.ini

; maximum memory that OPcache can use to store compiled PHP files
opcache.memory_consumption=256M

; maximum number of files that can be stored in the cache
opcache.max_accelerated_files=20000

不要检查PHP时间戳

在生产服务器上,PHP文件除非部署新的应用程序版本,否则不应更改。然而,默认情况下,OPcache会检查已缓存文件的内容是否发生了更改。这种检查会引入一些开销,可以通过以下方式避免:

; php.ini

; after each deploy, call `opcache_reset()` or restart the web server
; to empty the cache and regenerate the cached files. Otherwise you won't
; see the updates made in the application
opcache.validate_timestamps=0

注意

OPcache对于Web服务器和命令控制台是不同的。您不能通过在终端中执行某个命令来清除Web服务器的OPcache。您需要重新启动Web服务器或通过Web服务器调用opcache_reset()函数(即通过在脚本中包含此功能并在Web上执行)。

配置PHP realpath Cache

当相对路径转换为其真实和绝对路径时,PHP会将结果缓存以提高性能。默认的缓存配置不适用于打开许多PHP文件(例如Symfony)的应用程序。建议按以下方式更改这些设置:

; php.ini

; maximum memory allocated to store the results
realpath_cache_size=4096K

; save the results for 10 minutes (600 seconds)
realpath_cache_ttl=600

配置PHP的真实路径缓存

PHP使用内部缓存来存储文件路径映射到其真实和绝对的文件系统路径的结果。这提高了像Symfony这样打开许多PHP文件的应用程序的性能,特别是在Windows系统上。

默认情况下,PHP设置realpath_cache_size为16K,这对Symfony来说太低了。考虑将此值更新至至少4096K。另外,默认情况下缓存路径仅存储120秒。考虑使用realpath_cache_ttl选项来更新此值:

; php.ini

realpath_cache_size=4096K
realpath_cache_ttl=600

优化Composer自动加载器

在开发应用程序时使用的类加载器被优化为查找新的和更改的类。在生产服务器上,PHP文件不应该更改,除非部署了新的应用程序版本。这就是为什么您可以使用Composer的自动加载器优化一次扫描整个应用程序并构建一个“类映射”,它是所有类位置的大数组,并存储在vendor/composer/autoload_classmap.php中。

执行此命令以在安装时生成类映射(因此使其成为部署过程的一部分):

$ composer install --no-dev --optimize-autoloader --classmap-authoritative --apcu-autoloader

--no-dev排除了仅在开发环境中需要的类(例如测试)。

--optimize-autoloader会转储应用程序中使用的每个符合PSR-0和PSR-4标准的类。

--classmap-authoritative防止Composer扫描文件系统以查找未在类映射中找到的类。

--apcu-autoloader您需要安装APCu PHP扩展才能使用此选项。它将在APCu中缓存类映射。但是,它不会生成类映射,因此您始终需要与--optimize-autoloader一起使用。

提示

如果您的生产服务器仍然使用遗留的APC PHP扩展而不是OPcache,请在应用程序中安装APCu Polyfill组件以启用与APCu PHP函数兼容,并解锁对高级Symfony功能的支持,例如APCu Cache适配器。

注意

当使用APCu自动加载程序时,如果添加新类,则会自动找到这些类,并且一切都将像以前一样工作(即没有清除缓存的原因)。但是,如果更改特定命名空间或前缀的位置,则需要清除APCu缓存。否则,自动加载程序仍将查看该命名空间内的所有类的旧位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接