在Symfony2中,我尝试对少数在一天内始终返回相同内容的ajax调用使用http缓存。
我的控制器的代码以如下方式结束:
$response = new JsonResponse($data);
$response->setPublic();
$response->setExpires(new \DateTime("+1 hour"));
$response->setMaxAge(3600);
return $response;在响应(来自火狐或IE11)中,我可以找到预期的头部。但它总是返回200代码(OK),而不是304 (未修改)。这意味着服务器总是生成响应,而我的目标是使服务器负载过重。
我还尝试使用@Cache注解来获得相同的结果。
如何让它工作?
发布于 2015-08-04 17:55:26
通过在app.php中使用AppCache内核(用PHP语言编写的反向代理),可以使symfony返回304响应
$kernel = new AppKernel('dev', true);
$kernel->loadClassCache();
$kernel = new AppCache($kernel); // Uncomment or add this line to app.php在生产环境中,您应该考虑使用真正的反向代理服务器,比如Varnish。
http://symfony.com/doc/current/book/http_cache.html
发布于 2015-08-04 19:17:27
通过在响应上添加LastModified头,我成功地缓存了您的示例响应。我做以下两件事:
1.将Symfony配置为反向代理
我创建了一个自定义环境,在web文件夹中创建了一个名为app_cache的文件。如下所述的here in the doc:
#web/app_cache.php
<?php
// web/app.php
require_once __DIR__.'/../app/bootstrap.php.cache';
require_once __DIR__.'/../app/AppKernel.php';
require_once __DIR__.'/../app/AppCache.php';
use Symfony\Component\HttpFoundation\Request;
$kernel = new AppKernel('prod', false);
$kernel->loadClassCache();
// wrap the default AppKernel with the AppCache one
$kernel = new AppCache($kernel);
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);2.在响应上添加Last Modified头部
我使用这个控制器:
/**
* @Route("/cache-me", name="cacheme")
*/
public function cacheMeAction(Request $request)
{
$data = array("hello" => "symfony");
$response = new JsonResponse($data);
$response->setPublic();
$response->setExpires(new \DateTime("+1 hour"));
$response->setLastModified(new \DateTime("-1 hour"));
return $response;
}3.测试
我清除了生产环境(app/cache -e=prod)的缓存,并使用浏览器向url发出了两个请求:
http://sf.localhost/app_cache.php/cache-me
第一个返回200 Ok,第二个304未修改
希望这对你有所帮助
发布于 2015-08-04 18:20:53
另一种方法是在执行常规操作(如查询数据库和获取内容)之前,使用控制器中的cache服务手动缓存您的数据,只需检查是否已存在缓存的数据,然后将这些数据发送给用户,否则执行常规操作并将新数据保存在缓存中。JsonResponse类接受状态代码的第二个参数,此处您可以手动设置304
$cache = $this->container->get( 'cache' );
$cache_key = 'trafficfeed';
if ( $cache->contains( $cache_key ) ) {
$data = $cache->fetch($cache_key );
/** here $data is a cached data */
/** Response::HTTP_NOT_MODIFIED => 304*/
$response = new JsonResponse($data,Response::HTTP_NOT_MODIFIED);
return $response;
}
/** Fetch fresh data and save in cache */
$cache->save( $cache_key, $data, 3600 );
$response = new JsonResponse($data);对于缓存服务,您需要在配置中对其进行定义
services:
cache:
class: Doctrine\Common\Cache\PhpFileCache
arguments: [%kernel.cache_dir%]https://stackoverflow.com/questions/31805454
复制相似问题