php 动态输出图片 http header 304 状态

有许多的站长会把自己的图片利用php输出来了这样的话对于用户来讲没有什么区别对于搜索引擎来讲有一些区别了,如果我们没有更新但输入的还是不是304的话搜索引擎会认为图片更新了,为了解决这个问题我们来看看如何处理吧.

什么是304 状态

如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容,自上次访问以来或者根据请求的条件,并没有改变,则服务器应当返回这个304状态码,简单的表达就是:客户端已经执行了GET,但文件未变化.

php 动态输出图片为什么要输入304

客户端是怎么知道这些内容没有更新的呢?其实这并不是客户端的事情,而是你服务器的事情,大家都知道服务器可以设置缓存机制,这个功能是为了提高网站的访问速度,当你发出一个GET请求的时候服务器会从缓存中调用你要访问的内容,这个时候服务器就可以判断这个页面是不是更新过了,如果没有更新过那么他会给你返回一个304状态码。

有时候需要是用php动态生成图片,比如多个比例的缩略图,但是是用php生成的图片的header 头部状态都是200,不能被缓存,这显然也不太合适.

可以如何通过缓存PHP生成的图像,此功能只检查头,看看图像是否是最新的,并发送304代码,如果是这样,那么浏览器将使用缓存的版本,而不是下载新的,否则新的图像输出到浏览.

php 动态输出图片 http header 304 代码:

  1. <?php
  2. // return the browser request header
  3. // use built in apache ftn when PHP built as module,
  4. // or query $_SERVER when cgi
  5. function getRequestHeaders()
  6. {
  7. if (function_exists("apache_request_headers"))
  8. {
  9. if($headers = apache_request_headers())
  10. {
  11. return $headers;
  12. }
  13. }
  14. $headers = array();
  15. // Grab the IF_MODIFIED_SINCE header
  16. if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
  17. {
  18. $headers['If-Modified-Since'] = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
  19. }
  20. return $headers;
  21. }
  22. // Return the requested graphic file to the browser
  23. // or a 304 code to use the cached browser copy
  24. function displayGraphicFile ($graphicFileName, $fileType='jpeg')
  25. {
  26. $fileModTime = filemtime($graphicFileName);
  27. // Getting headers sent by the client.
  28. $headers = getRequestHeaders();
  29. // Checking if the client is validating his cache and if it is current.
  30. if (isset($headers['If-Modified-Since']) &&
  31. (strtotime($headers['If-Modified-Since']) == $fileModTime))
  32. {
  33. // Client's cache IS current, so we just respond '304 Not Modified'.
  34. header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).
  35. ' GMT', true, 304);
  36. }
  37. else
  38. {
  39. // Image not cached or cache outdated, we respond '200 OK' and output the image.
  40. header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fileModTime).
  41. ' GMT', true, 200);
  42. header('Content-type: image/'.$fileType);
  43. header('Content-transfer-encoding: binary');
  44. header('Content-length: '.filesize($graphicFileName));
  45. readfile($graphicFileName);
  46. }
  47. } //phpfensi.com
  48. //example usage
  49. displayGraphicFile("./images/image.png");
  50. ?>