我们有一个基于Symfony 3.2的运行应用程序(当时以Symfony 2.3开始)和Doctrine ORM 2.5,它的发展方式非常棒。
我读了很多关于新的Symfony Cache组件,APC和APCU的up和down,opcache,Symfony中的chaching请求等等......但是老实说这次你失去了我一点。 / p>
所以我很想知道是否可以支持我1)理解和2)在生产中为“标准”Symfony / Doctrine应用程序实现缓存。
前提条件/假设
1) opcache 应该启用并激活并缓存任何与字节码相关的内容。
2)我目前没有任何要求缓存我自己的应用程序的东西。这些都是关于框架缓存的,如注释,类映射,验证,ORM元数据等。
2)大多数开发人员不想处理多个缓存提供程序,所以无论是APCu,xcache,redis,memcache还是其他任何东西。可能有很好的理由为不同的任务设置不同的任务,但让我们坚持一个以保持简单。
以产品模式在“标准”Symfony / Doctrine应用程序中缓存选项
1)课程加载
我们仍然在app.php
:
$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和新的Cache组件是否仍然有效。如果需要,如何将其更改为不同的缓存提供程序。我怎么能用Symfony 3.2 Cache将它改成'最新'?
3)Doctrine Caching:
或多或少相同的问题适用于config_prod.yml
中的学说orm部分:
doctrine:
orm:
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
问题:
这仍然是要走的路吗?如何更改它使用新的Symfony Cache组件 - 无论如何都可以这样做?
4)新选项?
新的怎么样?选择?在config_prod.yml
中设置:
framework:
cache:
app: cache.adapter.someProviderOrPool
system: cache.adapter.someProviderOrPool
问题:
这里缓存了哪些信息,由谁以及以某种方式取代/扩展上述某些主题?
总结一下:
我想基本上改变我的所有prod配置以适应Symfony 3.2并且我想尽可能使用redis进行缓存(替换apc),但我完全不知道如何以及从何处开始。
**** **** EDIT
在这种情况下,Symfony Cache Component和DoctrineCacheBundle如何一起玩?更换?加起来?建设?一起工作?冲突?不可比?
答案 0 :(得分:2)
Symfony的性能文档已过时。我们已经与另一个提交者更新了它,但Pull Request仍在等待批准。我现在只是在这里复制/粘贴新文档。 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
注意强>
对于Web服务器和命令控制台,OPcache是不同的。您无法通过在终端中执行某些命令来清除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使用内部缓存来存储将文件路径映射到其实际和绝对文件系统路径的结果。这提高了打开许多PHP文件的Symfony等应用程序的性能,特别是在Windows系统上。
默认情况下,PHP设置的realpath_cache_size为16K,这对于Symfony来说太低了。考虑将此值至少更新为4096K。此外,默认情况下,缓存路径仅存储120秒。考虑使用realpath_cache_ttl
选项更新此值:
; php.ini
realpath_cache_size=4096K
realpath_cache_ttl=600
优化Composer Autoloader
开发应用程序时使用的类加载器已经过优化,可以查找新的和更改的类。在生产服务器中,除非部署新的应用程序版本,否则不应更改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缓存适配器。
注意强>
使用APCu自动加载器时,如果添加新类,将自动找到它们,一切都将像以前一样工作(即没有理由“清除”缓存)。但是,如果更改特定命名空间或前缀的位置,则需要刷新APCu缓存。否则,自动加载器仍将查看该命名空间内所有类的旧位置。