Php 如何缓存脚本图像

Php 如何缓存脚本图像,php,caching,Php,Caching,我想实现一个脚本,在请求的文件(图像)上生成缩略图。下面是一个简单的操作列表,用于了解脚本的工作: 请求服务器url/preset/filename.jpg 检查文件是否已被翻阅 如果没有,则生成一个新文件并返回该文件。 如果存在,则返回已浏览的文件 这工作得很完美,但问题是浏览器没有缓存图像。我对缓存不太熟悉。我认为返回304 Not modified会触发浏览器从缓存中获取图像,但它挂起在挂起状态 有人知道如何缓存这些图像吗 这是我的脚本的显示部分: private function _

我想实现一个脚本,在请求的文件(图像)上生成缩略图。下面是一个简单的操作列表,用于了解脚本的工作:

  • 请求服务器
    url/preset/filename.jpg
  • 检查文件是否已被翻阅
  • 如果没有,则生成一个新文件并返回该文件。 如果存在,则返回已浏览的文件
这工作得很完美,但问题是浏览器没有缓存图像。我对缓存不太熟悉。我认为返回
304 Not modified
会触发浏览器从缓存中获取图像,但它挂起在挂起状态

有人知道如何缓存这些图像吗

这是我的脚本的显示部分:

private function _show_image($file_path, $filename, $new = FALSE) {
        $this->load->helper('file');

        if($new) { 
            header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK');
        } else {
            //header('HTTP/1.1 304 Not Modified');
            header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified');  
        }

        header('Cache-Control: public'); // needed for i.e.
        header('Content-type: ' . get_mime_by_extension($file_path));
        header('Content-Transfer-Encoding: Binary');
        header('Content-Length:' . filesize($file_path));
        //header('Content-Disposition: attachment; filename=' . $filename);
        header('Content-Disposition: inline; filename=' . $filename);
        readfile($file_path);
        exit(); 
    }
更新 我更新了代码,以便它首先检查
$\u服务器['HTTP\u if\u MODIFIED\u SINCE']
是否已设置,如果已设置,则执行所有检查。但问题是浏览器从来没有发送过这个标题

以下是访问文件时的发送和接收头

请求

Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:PHPSESSID=heiog0hdasg181l45cfbm7u353; __jwpusr=264f6c61-3752-4682-a61b-e02b822c7815
Host:domain.local
Range:bytes=0-
Referer:http://domain.local/test
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
回应

Cache-Control:public
Connection:Keep-Alive
Content-Description:File Transfer
Content-disposition:inline
Content-Length:24103476
Content-Transfer-Encoding:binary
Content-Type:video/mp4
Date:Thu, 30 May 2013 14:07:02 GMT
Expires:0
Keep-Alive:timeout=5, max=98
Last-Modified:Wed, 29 May 2013 09:03:30 GMT
Server:Apache/2.2.22 (Win32) PHP/5.3.13
X-Frame-Options:SAMEORIGIN
X-Powered-By:PHP/5.3.13
X-XSS-Protection:1; mode=block 

如果可以的话,我的第一个建议是将缓存留给Apache本身。它最了解如何发送头并响应缓存请求

如果您真的想自己做这件事,您需要确定浏览器何时请求图像,或者只检查是否有更改(
,如果自
以来进行了修改)

您没有设置expires或max age,因此它可能根本没有缓存映像

Expires Mon, 16 Oct 2012 11:07:06 GMT
Cache-Control   public, max-age=120

当它给出一个新的请求时(如果自以来修改了,则没有
),您只是返回了一个它没有预料到的304。

如果可以的话,我的第一个建议是将缓存留给Apache本身。它最了解如何发送头并响应缓存请求

如果您真的想自己做这件事,您需要确定浏览器何时请求图像,或者只检查是否有更改(
,如果自
以来进行了修改)

您没有设置expires或max age,因此它可能根本没有缓存映像

Expires Mon, 16 Oct 2012 11:07:06 GMT
Cache-Control   public, max-age=120
当它发出一个新的请求时(如果自
修改,则没有
),您只发送了一个它没有预料到的304。

如果客户端向您发送了一个If-Modified-Since头,则您只能发送一个304“not Modified”,例如:

如果修改自:Sat,1994年10月29日19:43:31 GMT

或者,如果没有匹配:

如果没有匹配:“737060cd8c284d8af7ad3082f209582d”

您无法知道图像是否仍在浏览器的缓存中,或者是否已被清除。正确的操作是在创建缩略图时返回图像。如果缩略图存在,请检查If Modified-Since标头(这是浏览器,指示其当前缓存中有文件),如果文件未更改,则返回304 Not Modified。否则返回文件,因为它不在浏览器的缓存中

如果不匹配系统使用ETag,如果您不需要处理它们,最好避免使用这些ETag。

如果客户端向您发送了If Modified-Since标头,则您只能发送304“Not Modified”,例如:

如果修改自:Sat,1994年10月29日19:43:31 GMT

或者,如果没有匹配:

如果没有匹配:“737060cd8c284d8af7ad3082f209582d”

您无法知道图像是否仍在浏览器的缓存中,或者是否已被清除。正确的操作是在创建缩略图时返回图像。如果缩略图存在,请检查If Modified-Since标头(这是浏览器,指示其当前缓存中有文件),如果文件未更改,则返回304 Not Modified。否则返回文件,因为它不在浏览器的缓存中


If None Match系统使用etag,如果不需要处理它们,最好避免使用它们。

如果使用Apache,最好添加mod_rewrite。您可以创建一个重写规则,仅当请求的图像不存在时才将请求重定向到PHP

缩略图目录中的.htaccess文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /thumbnailer.php

然后thumbnailer.php需要检查$_服务器['REDIRECT_URL'](或一些类似的变量,检查phpinfo)以查看需要生成哪个文件。

如果您使用的是Apache,最好添加mod_rewrite。您可以创建一个重写规则,仅当请求的图像不存在时才将请求重定向到PHP

缩略图目录中的.htaccess文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /thumbnailer.php

thumbnailer.php需要检查$\u服务器['REDIRECT\u URL'](或一些类似的变量,检查phpinfo)以查看需要生成哪个文件。

您还应该检查“If Modified Since”标题。例如,您必须在304头之后立即停止脚本,并使用
exit
。现在您的脚本继续执行并每次返回映像。您还应该检查“If Modified Since”标题。例如,您必须在304头之后立即停止脚本,并使用
exit
。现在您的脚本将继续执行并每次返回图像。Thx用于回答。我刚刚更新了代码(问题中没有),但我看到响应头包含
Pragma:no cache
。我用
header\u remove()
删除了此标题,但浏览器一直忽略发送修改后的内容。我用发送和检索的标题更新了问题。谢谢回答。我刚刚更新了代码(问题中没有),但我看到响应头包含
Pragma:no cache
。我用
header\u remove()
删除了此标题,但浏览器一直忽略发送修改后的内容。我用“发送”和“检索”标题更新了该问题。此解决方案的标题为+1。但是我需要能够记录总的视图。如果您不需要实时视图,并且您可以访问日志,那么您可以按照计划解析Apache日志,查看缩略图的点击率。此解决方案+1。但是我需要能够记录总的视图。如果您不需要实时视图,并且您可以访问日志,那么