强制Codeigniter使用清漆

时间:2013-07-29 08:06:53

标签: php codeigniter varnish

我有一个已经使用codeiginter内置缓存的codeiginter应用程序,我将Varnish应用为新的缓存层。但正如我从varnishstat中看到的那样,它并没有产生那么大的影响。

Hitrate ratio:        1        1        1
Hitrate avg:     0.0480   0.0480   0.0480

我认为这是因为正在发回的Codeiginter cookie和HTTP Headers。

这是来自清漆的http请求。

Accept-Ranges:bytes
Age:0
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:keep-alive
Content-Encoding:gzip
Content-Length:1755
Content-Type:text/html
Date:Mon, 29 Jul 2013 07:25:59 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Pragma:no-cache
Server:Apache/2.2.22 (Ubuntu)
Set-Cookie:ci=%2BEZFRauewyNnl3CXHE0cmz6F3G3moadilt5vXu5gghKXkWm4gg0JObnF2Etq6J5rl3XVigbF0je3funibpvEi4X%2BT3rS2VmazGG3T4Vm1%2B8YcbqRgL4xuMcxybndqJy%2BU9mNmsJjOgmYEZ8oPG8BKOtMaxNiMHmgmbBydxt3SzKfFfFUOydFx%2BeeJ7P1WE7V10m6GyfnFO5DrFYNsE%2F37WNAI%2Bpux%2Fwwch5B4DH1%2F6wssPm%2BNwsLQ1%2FBd44hgUXe3mMzzcqvxNjKqs0gjuwzwPT4nibEHirfaJ7TMVGObMjdrbREnoYS2gwoN15cCeKgXmTJQI2vvTuPcdtZVCjcAX6OvTy491HdIvQIdKRhX2BNi8d7ygo%2F7n5T6%2FN%2B0IohNN9iZ%2Fh959W%2Fz4azEJPfTrluucf6cLnlp2T2zb%2Fb3XroWuPqguk4wMpsAstfLsSfA%2F6yEi4Hph%2BPFxX%2BhyBazs11LJ38FA0flWtYY%2Bk%2B6yoF13sTaENN2pWj0bKDTtres9E4y3xMPr%2FZaO78WRA9CccDzcQfbZ3bZUqoXg4HmX%2BHDHiYPLD6uFpnC28LuDrCSbgXFIlhDrC8j65sxNSKhnzlUP7Konr%2FKRfKNzrgtWHBEzuXArW%2BlgIg1MzaW3GIkRy1gr16ZUjIiv7CCx7Y2twAfKOm4t00MvrTcFoxBPN1lzoasNyRLMIvshU8heWZHy17OPEapuO6N%2BuMl9L8LqU0%2FF%2BUeUDyFVwLG39LGkIVuF93VsIYEp6w2UwtccX4OO4P2uwJEoAJMMqUE%2FztELpCv%2BkfRAiub48n%2BRxK%2FhgUHw1LWsWIPv3xngq3MI8ypWCqkWLjPuu5dc%2FdOd3BSW2MYcBwacoB5CEOPBHGq3hw1QSZfY330hkLuyQPHxkh%2FDTija%2FN2Rz6z47JorsCqHGDBK6%2BPswBWvYZeMd0VMD%2F95j%2BFibi6rBqL3hoE%2BDgcfCdly%2FYH9py%2Fe%2Fa0AUiIINTK8EPtpuKdC8dLhKo2jI5J4e1ifZuWjVd3VnL2CvX; path=/
Vary:Accept-Encoding
Via:1.1 varnish
X-Powered-By:PHP/5.3.10-1ubuntu3.5
X-Varnish:1353481467

我发现了不同之处:

  1. 无论我怎么努力,我都会尝试不改变 {i} Cache-ControlAgeExpires,直到我手动设置
  2. Codeiginiter发送旧日期1981我加倍检查了我的日期 服务器是正确的
  3. Codeiginiter几乎每次请求都会更改Cookie。
  4. 在我的应用程序中,我有几个页面需要用户名/密码,但我首先关注的是让公共页面被缓存。之后,我将检查帐户相关的页面。

    我正在测试这段代码:

    //$this->output->set_header("Cache-Control:public, max-age=9000");
    //$this->output->set_header("Vary: Accept-Encoding,Cookie,User-Agent");  
    $this->output->cache(2400);
    $this->load->view("test");
    

2 个答案:

答案 0 :(得分:0)

如果您的后端正在发送Cache-control: max-age=XXX,您可以忘记Expires标头,因为它将在符合HTTP 1.1的客户端& proxys [1](实际上,通常将它设置为过去以避免旧的HTTP 1.0客户端缓存项目。)

设置Vary: User-Agent标题时要非常小心,因为它可能会损害您的缓存机会[2]

最后,由于Set-Cookie标题,Varnish不会缓存此类请求。 Varnish需要延迟会话初始化(参见[3])来缓存事物(或一个非常复杂的VCL)

如果您修复了cookie的问题并且仍然存在问题,那么VCL文件和清漆版本将会非常复杂。

[1] http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

[2] https://www.varnish-cache.org/docs/3.0/tutorial/vary.html

[3] How should I implement lazy session creation in PHP?

答案 1 :(得分:0)

您的Cookie问题是我目前正在努力解决的问题。我从您的示例中猜测您已将cookie_name变量更改为ci而不是ci_session。

最简单的事情 - 对于某些简单的值 - 可能是放弃CI的会话处理替代或切换到基于数据库的cookie而不是基于cookie。如果有一个set-cookie - 并且总是有你初始化/自动加载的会话 - 它就不会被缓存。如果数据全部存储在服务器端,则您不会遇到此问题。

就我个人而言,我并没有为我们使用会话引入数据库,因此我将尝试设置缓存控制标头以忽略cookie并在视图顶部使用header_remove()我知道永远不会是用户特定的(比如我们的RSS提要)。