PHP 304状态码指的是在客户端向服务器发出请求时,服务器在检查该资源的缓存标记后发现该资源并没有被修改,因此服务器不会返回该资源,而是返回这个状态码。它告诉客户端可以继续使用缓存副本,这样可以减轻服务器的负担,提高页面响应速度。
简单来说,就是服务器告诉客户端,之前请求的资源还没有被修改过,缓存还可以使用,不需要重新获取,可以直接使用缓存副本,以减轻服务器的压力。
//示例代码: header('HTTP/1.1 304 Not Modified'); exit();
这个状态码的应用场景很广泛,下面我们分别来看一下在何种情况下会返回304状态码。
浏览器缓存
浏览器在第一次请求服务器的文件时,服务器会返回 200 状态码,并且将文件以及相关的元数据一起发送到浏览器,比如:Last-Modified 和 Etag(实体标识)。浏览器收到这些数据后,会将它们缓存到本地。当浏览器下次请求这个资源时,它会将这些元数据一起发送给服务器,服务器从请求头信息中获取这些数据,并和服务器上的文件进行比对,如果没有更改,服务器就返回 304 状态码,否则返回最新版本的文件和相关元数据。
//示例代码: $file = 'test.txt'; // 获取最后修改时间 $time = filemtime($file); // 发送文件 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT', true, 200); exit();
CDN缓存
CDN(内容分发网络)缓存是通过 CDN 存储访问量大的网站资源,以加快网站的访问速度。当访问者请求资源时,CDN 会首先检查资源是否存在于缓存中。如果存在,CDN 就直接返回缓存中的资源,加速页面的响应。如果不存在,CDN 就会向源站(服务器)发送请求,并将资源缓存到自己的机器上,以便下次直接从缓存中取出。
在使用 CDN 缓存时,因为 CDN 前端有一个 Varnish 缓存服务器,这个服务器会比源服务器优先被客户端获取文件,他会去判断客户端请求文件的 Last-Modified 和 Etag 是否和 CDN 缓存服务器的 Last-Modified 和 Etag 相同,如果相同,则直接从 CDN 缓存中返回,否则再去获取最新版本的文件。
服务器缓存
服务器缓存是指服务器在处理请求时缓存一些资源,使得再次请求时可以直接从缓存中获取数据而不需要进行复杂的计算。有些服务器,比如 Apache、Nginx,在处理某些脚本时会将结果缓存在内存中,下次同样的请求就可以直接从内存中读取,而不需要再次执行相同的脚本。
//示例代码: // 缓存有效期为一分钟 $app->expires('+1 minute'); // 判断缓存是否存在 if ($app->etag($callback)) { $app->etag(); return $app->res->status(304); }
在 Web 开发中,缓存是极其重要的一环。如果你的网站没有缓存机制,那么每次请求都需要重新计算,响应时间将会非常慢。如果你的网站访问量很大,你的服务器可能要承受巨大的压力。这时,缓存就可以起到非常重要的作用,它能够明显减轻服务器的负担,提高页面响应速度,从而增强用户体验。
在捕捉到 304 HTTP 状态码时,浏览器通过读取缓存的副本来展示页面,减少了用户等待新资源加载的时间。我们应该尽量利用缓存的机制,以减少带宽的占用和服务器的负荷。在实际开发中,我们需要更加细致地处理缓存,以保证用户获取到最新的数据。