2016-12-02 100 views
8

我们有一个基于Symfony 3.2(当时是Symfony 2.3开始)和Doctrine ORM 2.5的正在运行的应用程序,它是如何发展的。试图理解和实现Symfony 3 Caching for Framework和Doctrine

我读了很多关于新的Symfony缓存组件,APC和APCU的up和down,opcache,Symfony中chaching的pull request等等,但这次真的很诚实,你让我失望了一下。

所以我恳请一个人能否支持我1)理解和2)为生产中的“标准”Symfony/Doctrine应用程序实现缓存。

前提条件/假设

1)opcache应启用,并主动和缓存内容的字节码有关。

2)我目前没有任何要求来缓存我自己的应用程序的东西。这是关于像注释,类映射,验证,ORM元数据等框架缓存。

2)大多数开发人员不想处理多个缓存提供程序,所以它是APCu,xcache,redis,memcache或还要别的吗。对于不同的任务可能有很多不同的理由,但让我们坚持一个以保持简单。

在PROD模式 “标准” 的Symfony /原则应用缓存选项

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相矛盾。

问:

它仍然需要/所需/执行显著更好地已建立了此缓存的类加载器?

现在是否足够使用标准的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 

问:

要很诚实,我不知道,这是否仍然是VA Symfony 3.2和新的缓存组件。以及如何将其更改为不同的缓存提供程序(如果需要)。我怎么能改变它与Symfony 3.2 Cache的'最新'?

3)学说缓存:

或多或少同样的问题适用于学说ORM节config_prod.yml

doctrine: 
orm: 
    metadata_cache_driver: apc 
    result_cache_driver: apc 
    query_cache_driver: apc 

问题

这仍然是要走的路?如何改变这个使用新的Symfony缓存组件 - 这可以做到这一点吗?

4)新选项?

新的呢?选择?的设定config_prod.yml

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

问题

什么样的信息在这里缓存,由何人并不知何故这个替换/扩展上面的一些议题是什么?

概括起来:

我想根本上改变我所有的督促CONFIGS是complient与Symfony的3.2,我想使用Redis的缓存(更换APC)只要可能,但我完全不知道如何以及从哪里开始。

**** ****编辑

同样在这种情况下怎么办Symfony的缓存组件和DoctrineCacheBundle一起玩?更换?加起来?建立在?一起工作?冲突?不可比较?

+0

为什么downvote?或者至少可以一个downvoter很快评论如何改善这个问题? – LBA

回答

0

Symfony的性能文档已过时。我们已经用另一个提交者更新了它,但合并请求仍在等待批准。我现在只是在这里复制/粘贴新文档。 You can find the GitHub Pull Request here

使用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真实路径缓冲区

当一个相对路径转化成其真实和绝对路径,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设置一个16K的realpath_cache_size,对于Symfony而言太低。考虑将此值更新至少4096K。另外,缓存路径默认只存储120秒。考虑过更新此值使用realpath_cache_ttl选项:

; php.ini 

realpath_cache_size=4096K 
realpath_cache_ttl=600 

优化作曲自动加载

使用而开发的应用程序进行了优化,以找到新的和更改类的类加载器。在生产服务器中,除非部署新的应用程序版本,否则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填充工具组件您的应用程序能够与APCu PHP函数兼容,并解除对高级Symfony功能(例如APCu Cache适配器)的支持。

注意

当使用APCu自动加载,如果添加新的类,它们将被自动发现,一切都将工作和以前一样(即没有理由“清除”的高速缓存)。但是,如果更改特定名称空间或前缀的位置,则需要刷新APCu缓存。否则,自动加载器仍然会查看该名称空间内所有类的旧位置。