用PHP服务大量或许多辅助文件并不完全是它的目的。
取而代之的是,将Nginx用作X-accel,将Lighttpd
用作X-Sendfile或将Apache
用作mod_xsendfile。
最初的请求由PHP处理,但是一旦确定了下载文件,它将设置一些标头以指示服务器应处理文件发送,此后,PHP进程将释放以处理其他内容。
然后,您可以使用Web服务器为您配置缓存。
静态生成的内容
如果您的内容是从PHP生成的,并且创建起来特别昂贵,则可以将输出写入本地文件,然后再次应用上述方法。
如果您无法写入本地文件或不想写入本地文件,则可以使用HTTP响应标头来控制缓存:
Expires: <absolute date in the future>Cache-Control: public, max-age=<relative time in seconds since request>
这将导致客户端缓存页面内容,直到它过期或当用户强制重新加载页面时(例如,按F5键)。
动态生成的内容
对于动态内容,您希望浏览器每次都能ping通您,但仅在有新内容时才发送页面内容。您可以通过设置其他一些响应头来完成此操作:
ETag: <hash of the contents>Last-Modified: <absolute date of last contents change>
当浏览器再次ping您的脚本时,它们将分别添加以下请求标头:
If-None-Match: <hash of the contents that you sent last time>If-Modified-Since: <absolute date of last contents change>
将
ETag主要用于降低网络流量在某些情况下,知道的内容哈希,你首先要计算它。
Last-Modified如果您具有本地文件缓存(文件具有修改日期),则最容易应用。一个简单的条件使其起作用:
if (!file_exists('cache.txt') || filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { // update cache file and send back contents as usual (+ cache headers)} else { header('HTTP/1.0 304 Not modified');}如果您不能进行文件缓存,则仍然可以使用它
ETag来确定内容是否已更改。



