Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter:清漆和Cookie/会话冲突_Php_Session_Caching_Varnish - Fatal编程技术网

Php Codeigniter:清漆和Cookie/会话冲突

Php Codeigniter:清漆和Cookie/会话冲突,php,session,caching,varnish,Php,Session,Caching,Varnish,我有一个网站,它依赖于会话和cookie。我想在上面实现Varnish缓存 浏览器打开时,网站具有相同的会话id,直到浏览器关闭。但是页眉中的年龄值保持0。此年龄值描述varnish是否缓存页面。0表示它没有缓存 要检查Varnish缓存是否工作,curl-I domainname是命令,我通过终端点击它,每次点击头部都会给出不同的PHPSESSIONID,年龄值也保持为0 无法准确确定什么是不允许Varnish缓存站点 为了测试,我对会话start()进行了注释,下面是以下观察结果。 在浏览器

我有一个网站,它依赖于会话和cookie。我想在上面实现Varnish缓存

  • 浏览器打开时,网站具有相同的会话id,直到浏览器关闭。但是页眉中的年龄值保持0。此年龄值描述varnish是否缓存页面。0表示它没有缓存

  • 要检查Varnish缓存是否工作,
    curl-I domainname
    是命令,我通过终端点击它,每次点击头部都会给出不同的PHPSESSIONID,年龄值也保持为0

  • 无法准确确定什么是不允许Varnish缓存站点

    为了测试,我对会话start()进行了注释,下面是以下观察结果。 在浏览器上

  • 未在浏览器中创建会话id cookie
  • 在同一页的几次点击中,年龄仍然保持在0
  • 终端上

  • php会话id未显示在标头响应中
  • 第一次点击时,年龄值为0,但在以后的点击中,年龄值不断增加 看起来Varnish在浏览器点击时无法缓存。特别是在指定域时


    如何让varnish缓存为基于会话的网站工作?有任何帮助吗?

    varnish不会缓存默认设置cookie的页面。解决这个问题有两种方法:

  • 从页面中删除cookies。只有当页面一开始不需要会话(即没有特定于用户的内容)时,这才适用于您。您可以这样做:

    // ... default.vcl
    sub vcl_recv {
      unset req.http.Cookie;
    
      return(hash);
    }
    
  • 将cookie添加到Varnish生成的哈希中,这意味着每个会话都将有自己的单独缓存(这仍然会提高性能,但远不如选择选项1那么重要。如下图所示:

    // ... default.vcl
    sub vcl_hash {
      hash_data(req.url);
    
      if (req.http.host) {
        hash_data(req.http.host);
      } else {
        hash_data(server.ip);
      }
    
      hash_data(req.http.Cookie);
    
      return(lookup);
    }
    
  • 您可能有一些页面似乎没有特定于用户的内容(比如说您有一个博客,博客文章不需要特定于用户的内容),但您可能有一些指示用户是否登录的内容。如果您可以通过AJAX将这一情况发生在非缓存或每会话缓存的端点上,那么一切都可以正常工作

    使用选项2,您可能会发现需要将Cookie临时存储在另一个标头中,以便Varnish实际缓存页面,您可以这样做:

    // ... default.vcl
    sub vcl_recv {
      set req.http.X-Cookie = req.http.Cookie;
      unset req.http.Cookie;
    
      return(hash);
    }
    

    然后简单地更改
    vcl\u hash
    函数,使用
    req.http.X-Cookie
    而不是
    req.http.Cookie

    我尝试了第二个选项,编辑了default.vcl。并注释了
    会话\u start()
    。因此不会创建会话。点击浏览器上的URL。以下是响应:
    接受范围字节年龄0缓存控制最大年龄=3600连接保持活动内容类型text/html;charset=UTF-8日期Wed,2015年4月22日17:59:57 GMT过期1981年11月19日星期四08:52:00 GMT布拉格缓存服务器Apache/2.2.15(CentOS)通过1.1 varnish-v4 X-Powered-By PHP/5.3.3 X-varnish 21在多次点击时传输编码分块。当点击在浏览器上时,它似乎不起作用。问题是你的expires头。它是过去的,因此varnish不会缓存它。PHP设置了一些它自己的头,因为它喜欢认为这是有帮助的。去厕所吧k:我试着用
    curl-I domainname
    在终端上点击,下面是回复:
    HTTP/1.1200确定日期:Wed,Apr2015年4月22日18:01:59 GMT服务器:Apache/2.2.15(CentOS)X-Powered-By:PHP/5.3.3 Pragma:cache-cache-Control:max age=3600 Content-Type:text/html;charset=UTF-8 X-Varnish:98369 32857 age:87 Via:1.1 Varnish-v4 Content-Length:28357连接:keep-alive
    看起来缓存在您输入的最后一条注释上起作用了,请注意年龄标题?哦,如果您还没有找到一件有用的东西n注意到了,当Varnish成功缓存某些内容时,您将看到
    X-Varnish
    标题有两个数值,而不是一个。