我遇到了symfony 2的一个奇怪的问题。我有一个应用程序,它上面有倒数计时器(倒计时小时和天)。
这种分钟计时器在90%的时间内完美运行,但是在负载很重的情况下,计时器卡住并且不会改变(可能是因为它正在提供缓存版本):
我们无法使用负载测试脚本复制错误,似乎只有在网站上有大量实际用户时才会发生。
我们的缓存选项设置如下:
class AppCache extends HttpCache
{
protected function getOptions()
{
return array(
'debug' => true,
'default_ttl' => 1 * 60 * 60,
'private_headers' => array('Authorization', 'Cookie'),
'allow_reload' => false,
'allow_revalidate' => false,
'stale_while_revalidate' => 2,
'stale_if_error' => 60,
);
}
}
偶尔缓存的响应具有以下标题:
HTTP/1.1 200 OK
Date: Fri, 17 May 2013 09:36:55 GMT
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7+squeeze15
P3P: CP="CURa CUR NID ADM ADMa DEV DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Cache-Control: private
X-Symfony-Cache: GET /my-app/show: miss
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
我们的Front Controller脚本文件如下:
<?php header('P3P: CP="CURa CUR NID ADM ADMa DEV DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\ClassLoader\ApcClassLoader;
$loader = require_once __DIR__.'/app/bootstrap.php.cache';
require_once __DIR__.'/app/AppKernel.php';
require_once __DIR__.'/app/AppCache.php';
$loader = new ApcClassLoader('sf2', $loader);
$loader->register(true);
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
$kernel = new AppCache($kernel);
Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
我们没有在此操作上明确设置任何http缓存,或者设置任何缓存,除了我们使用AppCache包装内核这一事实。这样做肯定会对我们网站的性能产生巨大影响,因为当我们关闭它时,负载测试期间负载会非常快速地增加。