首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2:使用http缓存

Symfony2:使用http缓存
EN

Stack Overflow用户
提问于 2015-08-04 17:24:46
回答 3查看 3.7K关注 0票数 4

在Symfony2中,我尝试对少数在一天内始终返回相同内容的ajax调用使用http缓存。

我的控制器的代码以如下方式结束:

代码语言:javascript
复制
    $response = new JsonResponse($data);
    $response->setPublic();
    $response->setExpires(new \DateTime("+1 hour"));
    $response->setMaxAge(3600);
    return $response;

在响应(来自火狐或IE11)中,我可以找到预期的头部。但它总是返回200代码(OK),而不是304 (未修改)。这意味着服务器总是生成响应,而我的目标是使服务器负载过重。

我还尝试使用@Cache注解来获得相同的结果。

如何让它工作?

EN

回答 3

Stack Overflow用户

发布于 2015-08-04 17:55:26

通过在app.php中使用AppCache内核(用PHP语言编写的反向代理),可以使symfony返回304响应

代码语言:javascript
复制
$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

票数 2
EN

Stack Overflow用户

发布于 2015-08-04 19:17:27

通过在响应上添加LastModified头,我成功地缓存了您的示例响应。我做以下两件事:

1.将Symfony配置为反向代理

我创建了一个自定义环境,在web文件夹中创建了一个名为app_cache的文件。如下所述的here in the doc

代码语言:javascript
复制
#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头部

我使用这个控制器:

代码语言:javascript
复制
/**
 * @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未修改

希望这对你有所帮助

票数 2
EN

Stack Overflow用户

发布于 2015-08-04 18:20:53

另一种方法是在执行常规操作(如查询数据库和获取内容)之前,使用控制器中的cache服务手动缓存您的数据,只需检查是否已存在缓存的数据,然后将这些数据发送给用户,否则执行常规操作并将新数据保存在缓存中。JsonResponse类接受状态代码的第二个参数,此处您可以手动设置304

代码语言:javascript
复制
$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);

对于缓存服务,您需要在配置中对其进行定义

代码语言:javascript
复制
services:

    cache:
        class: Doctrine\Common\Cache\PhpFileCache
        arguments: [%kernel.cache_dir%]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31805454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档