如何在Symfony 2中仅使用一个文件作为Doctrine注释读取器缓存


How to use just one file as Doctrine annotation reader cache in Symfony 2?

我正在开发一个在共享主机上运行的Symfony 2项目(我不得不承认,价格便宜但速度慢)。性能真的很差,甚至缩小了所有的css/js并启用了gzip压缩(PHP输出仅使用自定义PHP.ini)。服务器在5-10秒内做出响应,也就是解析和执行PHP文件的时间。下载资源只需要毫秒,因此延迟介于请求和响应之间。这就是我在Chrome网络控制台上发现的。

查看注释读取器缓存文件夹(app/cache/prod/annotations)时,我注意到其中有441*.cache.php文件。我认为注释阅读器会在每次请求时读取所有这些文件!

这可能是糟糕表现的根源。如何加快速度并编写一个使用较少文件或单个文件作为注释缓存的自定义注释缓存驱动程序

将注释缓存文件合并到一个文件中不会加快速度,而且会让他们慢下来。我对这种说法有一个解释。

首先,如果您检查Annotation缓存(文件)读取器源

82: public function getClassAnnotations('ReflectionClass $class) {
 ....
   $path = $this->dir.'/'.strtr($key, '''', '-').'.cache.php';
   if (!is_file($path)) {
       $annot = $this->reader->getClassAnnotations($class);
       $this->saveCacheFile($path, $annot);
       return $this->loadedAnnotations[$key] = $annot;
   }
 ....
return $this->loadedAnnotations[$key] = include $path;

所以,基本上,这里发生的是,每个文件都是注释特定类别的内容。这是一个简单的小文件准备使用。如果不存在,则表示缓存是手动"缓慢"生成的并保存以备将来使用。

如果您希望此驱动程序将缓存转储到一个文件中,则不要:

include $path;

你必须做一些类似的事情:

file_get_contents('one_big_cache');
...searching/regexps/arrays/loops...
return $result;

如果你问我的话,这看起来慢得多。

我并不是说这件事绝对正确,我很高兴听到关于这个主题的意见