car*_*lve 5 php http-caching http-headers laravel laravel-4
我的laravel4应用程序中有一个小型图像生成器。生成图像大约需要700毫秒,因此我开始在服务器上缓存生成的结果,并将其返回给浏览器,这样可以节省一些时间。
由于图像一旦生成就永远不会改变,所以我想告诉浏览器在本地缓存图像,并使用以下代码完成了此操作:
$path = $cacheFolderPath . $cacheFileName;
if (File::exists( $path )){
$response = Response::make(File::get($path));
$response->header('Content-Type', 'image/png');
$response->header('Content-Disposition', 'inline; filename="'.$cacheFileName.'"');
$response->header('Content-Transfer-Encoding', 'binary');
$response->header('Cache-Control', 'public, max-age=10800, pre-check=10800');
$response->header('Pragma', 'public');
$response->header('Expires', date(DATE_RFC822,strtotime(" 2 day")) );
$response->header('Last-Modified', date(DATE_RFC822, File::lastModified($path)) );
$response->header('Content-Length', filesize($path));
return $response;
}
Run Code Online (Sandbox Code Playgroud)
这会将带有状态代码的图像发送200 OK
到带有以下标头的浏览器:
Cache-Control:max-age=10800, pre-check=10800, public
Connection:Keep-Alive
Content-Disposition:inline; filename="pie_0_normal.png"
Content-Length:2129
Content-Transfer-Encoding:binary
Content-Type:image/png
Date:Wed, 07 Aug 2013 10:29:20 GMT
Expires:Fri, 09 Aug 13 10:29:20 +0000
Keep-Alive:timeout=5, max=93
Last-Modified:Wed, 07 Aug 13 10:14:42 +0000
Pragma:public
Server:Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
Set-Cookie:laravel_session=767487mhf6j2btv3k01vu56174; expires=Wed, 07-Aug-2013 12:29:20 GMT; path=/; httponly
X-Powered-By:PHP/5.4.7
Run Code Online (Sandbox Code Playgroud)
我的问题是我的浏览器(Chrome浏览器,未经其他测试)仍然拒绝简单地获取本地缓存版本,而是再次访问服务器。
我已经花了大约半小时的时间来寻找有关此主题的其他问题,所有这些问题都给了我答案,这些答案已经合并到上述代码中。因此,尽管我知道有类似的问题,但这是上述源代码所独有的。
我的问题是,我做错了什么导致浏览器无法缓存文件?
另一种方法是检查“If-Modified-Since”请求标头,因为它仅在浏览器已经拥有该文件时才会出现。
如果存在,则您知道该文件已创建,并且可以通过指向该文件的链接进行响应,否则运行上面的代码。像这样的东西...
// check if the client validating cache and if it is current
if ( isset( $headers['If-Modified-Since'] ) && ( strtotime( $headers['If-Modified-Since'] ) == filemtime( $image->get_full_path() ) ) ) {
// cache IS current, respond 304
header( 'Last-Modified: ' . $image->get_last_modified(), true, 304 );
} else {
// not cached or client cache is older than server, respond 200 and output
header( 'Last-Modified: ' . $image->get_last_modified(), true, 200 );
header( 'Content-Length: ' . $image->get_filesize() );
header( 'Cache-Control: max-age=' . $image->get_expires() );
header( 'Expires: '. gmdate('D, d M Y H:i:s \G\M\T', time() + $image->get_expires() ) );
header( 'Content-Type: image/jpeg');
print file_get_contents( $image->get_full_path() );
}
Run Code Online (Sandbox Code Playgroud)