我对缓存网站有几个疑问,因为我以前没有尝试过缓存网站。
首先是如何缓存网站,以便客户浏览网站时加载速度更快。例如,我的 css 样式中有很多图像,我该如何缓存它们?
据我之前所读,php 中的缓存是通过标签完成的,并且缓存也可以在(很高兴我使用 htaccess ^_^)<head>
中完成。.htaccess
我在标题中添加了这个标签
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="expires" content="-1">
<meta http-equiv="pragma" content="no-cache">//or content="cache"???
这也是我的 htaccess 里面的内容:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
答案1
缓存很少是一种“临时”解决方案,但如果正确实施,它可以显著提高网站的速度。
您提到的第一项“大量 CSS 图像”本身并不是服务器问题。要获取这些图像,浏览器必须对每个图像发出请求,每个图像都有自己的开销。将图像组合成 CSS 精灵,这样您就可以最大限度地减少请求数量,并最大限度地提高所选图像格式的压缩率。类似的想法也适用于 CSS 和 JS 文件 - 尽可能合并和缩小。对于网站特定的建议,请尝试 Google 的 Pagespeed 或 Yahoo 的 YSlow。
在服务器端,有许多 PHP 缓存,用于存储翻译脚本的中间形式 - 操作码缓存。最常用的是 APC,但也经常使用 xcache 和 eaccelerator(仅使用其中之一)。
从 PHP 方面来看,缓存通常涉及生成内容的静态副本。这可以使用输出缓冲(ob_* 函数(例如 ob_start()))来实现。在发送任何内容之前开始缓冲,在页面完全构建后结束缓冲并将结果内容保存到文件中。然后,在尝试 PHP 脚本之前检查是否存在这样的文件(即,如果缓存存在,则提供该文件,否则加载脚本)。
此外,您还可以在 Web 堆栈中添加一个附加层 - Varnish 是一种流行的选择。它是一个反向代理和缓存服务器。本质上,Varnish 接收对后端服务器的请求,如果它已经有页面的副本,它将直接提供该页面 - 绕过后端。如果它没有请求的副本,它将把它传递给后端。Varnish 可以配置为将其缓存直接存储在内存中,也可以使用磁盘支持的存储,并且它的工作效率很高。
与任何缓存方法一样,您都面临着泄露敏感信息的潜在问题 - 如果您缓存的页面应该只对登录用户可见,但最终却将其提供给未经身份验证的用户,那么您就会遇到问题。因此,像 Varnish 这样的服务器往往不会缓存任何包含 cookie 的请求 - 这对于实际实现高命中率非常重要。
另一个可能的考虑因素是使用内容分发网络 - 一种在地理上更靠近用户的网络边缘位置的服务,以便可以更快地满足多个请求 - 但通常,这更多地是针对大文件的考虑 - 如果您正在提供许多小文件(例如图像),您可能会改进您的网站设计。
答案2
正如大卫所说,你的问题非常广泛。
但是,在尝试了解您的想法后,我认为您想要的是使用 HTTP 缓存功能。我相信您希望访问您网站的用户的浏览器缓存其图像以及 .css 文件,这样他们就不必每次访问您的网站时都获取所有这些内容,从而加快加载速度。
嗯,HTTP 具有允许您这样做的功能。
从基础开始,HTTP 是一种请求-响应协议。浏览器发送资源请求,服务器响应。请求和响应都包含标头,标头分别描述了浏览器和服务器在收到响应和请求时必须如何表现。
您可以通过在 .htaccess 文件中设置响应标头来告诉用户的浏览器缓存图像和 .css。
为了实现此目标,您在响应中需要使用的标题如下所述:
HTTP/1.1 提供以下缓存响应标头:Expires 和 Cache-Control: max-age。它们指定资源的“新鲜度生命周期”,即浏览器可以使用缓存资源而无需检查 Web 服务器是否有新版本的时间段。它们是无条件应用的“强缓存标头”;也就是说,一旦设置它们并下载资源,浏览器将不会发出任何针对该资源的 GET 请求,直到达到到期日期或最大期限。
Last-Modified 和 ETag。它们指定资源的一些特征,浏览器会检查这些特征以确定文件是否相同。在 Last-Modified 标头中,这始终是一个日期。在 ETag 标头中,这可以是任何唯一标识资源的值(文件版本或内容哈希是典型的)。Last-Modified 是一个“弱”缓存标头,因为浏览器会应用启发式方法来确定是否从缓存中获取项目。(不同浏览器的启发式方法不同。)但是,这些标头允许浏览器在用户明确重新加载页面时发出条件 GET 请求来有效地更新其缓存资源。除非资源在服务器上发生变化,否则条件 GET 不会返回完整响应,因此延迟比完整 GET 低。
对于所有可缓存资源,指定 Expires 或 Cache-Control max-age 之一以及 Last-Modified 或 ETag 之一非常重要。同时指定 Expires 和 Cache-Control: max-age,或同时指定 Last-Modified 和 ETag 都是多余的。
取自:http://code.google.com/speed/page-speed/docs/caching.html。
在您理解这一点并选择您认为最适合您需求的标题后,您可以使用 apache mod_headers 和 FilesMatch 指令来执行此操作。
下面是您可以在 .htaccess 中放入的内容的示例(它可能正是您想要的):
<FilesMatch "\.(css|swf|png|jpg|jpeg|gif)$">
Header unset Pragma
Header unset Expires
Header set Cache-Control "max-age=604800"
</FilesMatch>
不过,在你这样做之前,我建议你下载适用于 Chrome 的 Google Page Speed 插件(http://code.google.com/speed/page-speed/download.html) 并安装它。然后,运行页面速度测试并查看其结果,特别是“利用浏览器缓存”部分,以便了解您是否真的需要采取行动。
答案3
至少在我看来,使用元标记控制静态 html 文件的缓存并不是很稳定。您应该看看 mod_expires(使用 HTTP 标头进行缓存控制):http://httpd.apache.org/docs/2.0/mod/mod_expires.html
如果您想缓存动态网站,您可以缓存整个页面或仅缓存数据库请求(取决于您的数据库/网站设计)。 也许这个链接有用: http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/
答案4
您的问题太宽泛了。“缓存”是在多个不同层面上进行的,因此询问“如何缓存我的网站”有点像询问“如何做晚饭”。有很多方法可以做到这一点。
如果你有一个动态网站,并且使用了 MySQL 等数据库,那么你可以在数据库层进行缓存。你也可以使用内存缓存或者亚太经合组织。您可以使用反向代理在服务器层进行缓存,例如漆。
这些甚至没有触及客户端缓存(即每个客户端的 Web 浏览器为该特定人缓存内容),这就是你所说的.htaccess 和标头信息。
您最好关注服务器端缓存,而不是客户端缓存。
构建缓存架构在很大程度上取决于应用程序的构建基础、内容更改的频率以及信息需要的更新程度。
如果您有一个动态网站,我首先建议您研究如何使用其内置的缓存机制来提高 MySQL 的性能。
如果您的网站非常繁忙,那么我建议您研究 Varnish 或其他反向代理缓存服务器的工作原理。
无论如何,请查看这些主题,学习,当您有更具体的问题时,请随时回来。