我在Ubuntu Server 12.04(64位)VM(VirtualBox)上运行Symfony2。主持人是MacBook专业版。出于某种原因,我在开发模式(app_dev.php)中获得了非常长的请求时间。我知道它在开发模式下速度较慢,但每个请求我说5-7秒(有时甚至更慢)。在我的Mac上,我在开发模式下获得200ms左右的请求时间。
在Symfony2分析器中查看我的时间线后,我注意到~95%的请求时间是“初始化时间”。这是什么?有什么原因可能会这么慢?
此问题仅适用于开发模式下的Symfony2,而不适用于我在VM上运行的任何其他站点,甚至不适用于生产模式下的Symfony2。
我看到了这个(http://stackoverflow.com/questions/11162429/whats-included-in-the-initialization-time-in-the-symfony2-web-profiler),但它似乎没有回答我的问题。
答案 0 :(得分:123)
默认情况下,我有来自Symfony2的5-30秒响应。 在开发环境中现在是~500ms 。
然后我修改了php.ini
中的以下内容:
realpath_cache_size = 4M
(或更多)XDebug
(使用phpinfo
测试)OPcache
(或APC)瞧,在开发模式下,回复不到2秒!希望它有所帮助。
之前: 6779毫秒
之后: 1587 ms
Symfony2从数千个文件中读取类,这是一个缓慢的过程。当使用小型PHP实时路径缓存时,如果它们不在PHP的实际路径缓存中,则每次在开发环境中发出新请求时,都需要逐个解析文件路径。 Symfony2默认情况下,实际路径缓存太小。在产品中,这当然不是问题。
缓存元数据(例如映射)对于进一步提升性能也非常重要:
doctrine:
orm:
entity_managers:
default:
metadata_cache_driver: apc
query_cache_driver: apc
result_cache_driver: apc
您需要为此启用APCu
。它是APC
没有字节码缓存,因为OPCache
已经进行了操作码缓存。自PHP 5.5开始构建OPCache
。
(在prod环境中,相同的响应是~80 ms)
请注意,这个项目使用30多个捆绑包,拥有数万行代码,几乎有100个自己的服务,因此只需几个简单的优化,0.5s在本地Windows环境中相当不错。
答案 1 :(得分:14)
我找出问题的原因(而不是Symfony2)。由于某些原因,在ubuntu VM上,某些文件的修改时间不正确(即将来等)。当symfony2使用filemtime()针对其注册表检查这些时间时,它确定缓存不再是新鲜的并且它重建整个事物。我还没弄清楚为什么会这样做。
答案 2 :(得分:4)
我还需要禁用xdebug (v2.2.21)
来调试我的macbook上的apache2 max timeout loading。它是使用macports安装的:
sudo port install php54-xdebug.
启用xdebug后,每个页面都会耗尽最大加载时间,并且会发送致命错误,超出调度的最大超时消息。禁用时,一切都在合理的预期时间内正常加载。我使用MAMP来实现这一点,默认情况下没有启用xdebug,并且apache2像往常一样快速运行。我可能会换另一个调试器,这很糟糕,因为xdebug以前工作正常。
配置:
答案 3 :(得分:4)
我们遇到同样的问题。 在这里,每个请求我们有10秒或更多。 我看看我是否删除了bootstrap.php.cache中的以下行,所有时间都返回正常状态(298 ms)。
foreach ($meta as $resource) {
if (!$resource->isFresh($time)) {
return false;
}
}
我们可能有错误的修改时间,但我们不知道如何修复。有人知道解决方案吗?
答案 4 :(得分:2)
如https://stackoverflow.com/a/12967229/6108843所述,此类行为的原因可能是Ubuntu VM设置。您应该按照https://superuser.com/questions/463106/virtualbox-how-to-sync-host-and-guest-time中的说明在主机和来宾操作系统之间同步日期和时间。
通过FTP将文件上传到VM时,文件修改日期会更改为主机的值。这就是为什么filemtime()返回错误的值。
答案 5 :(得分:2)
您可以移动APP/var/cache
в/dev/shm/YourAppName/var/cache
。但是,对于IDE自动完成和代码验证,在本地文件中构建容器也是很好的。在app/AppKernel.php
:
public function getCacheDir()
{
return $this->getVarOrShmDir('cache/' . $this->getEnvironment());
}
public function getLogDir()
{
return $this->getVarOrShmDir('logs');
}
private function getVarOrShmDir($dir)
{
$result = dirname(__DIR__) . '/var/' . $dir;
if (
in_array($this->environment, ['dev', 'test'], true) &&
empty($_GET['warmup']) && // to force using real directory add ?warmup=1 to URL
is_dir($result) && // first time create real directory, later use shm
file_exists('/bin/mount') && shell_exec('mount | grep vboxsf') // only for VirtualBox
) {
$result = '/dev/shm/' . 'YourAppName' . '/' . $dir . '/' . $this->getEnvironment();
}
return $result;
}
答案 6 :(得分:1)
我禁用了xdebug,导致加载时间从17秒减少到了0.5秒。
答案 7 :(得分:1)
我在开发过程中遇到了慢速页面加载的问题,当你调整CSS或类似东西时,这会非常令人沮丧。
经过一番挖掘,我发现对我来说问题是由Assetic引起的,它正在重新编译每个页面加载的所有资产:
通过禁用Assetic控制器,我能够大幅增加页面负载。但是,正如上面的链接所述,无论何时对资产进行更改(或对其进行设置),都需要重新生成资产。
答案 8 :(得分:-2)
在app_dev中,所有缓存和自动加载都是从头开始的,我发现开发中最慢的是orm。我回避使用orm并主要关注dbal因为它,尽管我可能不应该。 orm在sf2中使用了很多。我的猜测是,开发中最让你失望的是什么。看看你的dev config和prod config之间的区别。但是,对你的dev配置进行一些调整可以使开发变得更加快捷和愉快。只需尝试并注意你的行为。例如,关闭树枝控制器,然后修改很多模板将是一种令人沮丧的事情。您需要不断清理缓存。但就像你提到的那样,只有它的开发时间以及它的上线时间,symfony会为你加速。