FLEAPHP框架的文件缓存系统

来源:互联网 发布:yum 安装mysql client 编辑:程序博客网 时间:2024/05/16 08:58

FLEAPHP框架使用文件缓存,主要是是为了它自带的数据库操作服务的,当然,开发者也可以利用它提供的API来进行一些简单的缓存操作。

 

注意到其中的一些实现细节:

 

摘取一个缓存文件的内容如下:

 

<?php die(); ?>                        277145528a:5:{s:9:"REPORT_ID";a:12:{s:4:"name";s:9:"report_id";s:5:"scale";N;s:4:"type";s:3:"
int";s:9:"maxLength";s:2:"12";s:10:"simpleType";s:1:"R";s:7:"notNull";b:1;s:10:"primaryKey";b:0;s:13:"autoIncrement";b:1;s:6:"binary
";b:0;s:8:"unsigned";b:0;s:10:"hasDefault";b:0;s:11:"description";s:0:"";}s:9:"SITE_TYPE";a:12:{s:4:"name";s:9:"site_type";s:5:"scal
e";N;s:4:"type";s:7:"tinyint";s:9:"maxLength";s:1:"4";s:10:"simpleType";s:1:"I";s:7:"notNull";b:1;s:10:"primaryKey";b:0;s:13:"autoIn
crement";b:0;s:6:"binary";b:0;s:8:"unsigned";b:0;s:10:"hasDefault";b:0;s:11:"description";s:0:"";}s:8:"DESCRIBE";a:12:{s:4:"name";s:
8:"describe";s:5:"scale";N;s:4:"type";s:4:"text";s:9:"maxLength";i:-1;s:10:"simpleType";s:1:"X";s:7:"notNull";b:0;s:10:"primaryKey";
b:0;s:13:"autoIncrement";b:0;s:6:"binary";b:0;s:8:"unsigned";b:0;s:10:"hasDefault";b:0;s:11:"description";s:0:"";}s:5:"EMAIL";a:12:{
s:4:"name";s:5:"email";s:5:"scale";N;s:4:"type";s:7:"varchar";s:9:"maxLength";s:3:"255";s:10:"simpleType";s:1:"C";s:7:"notNull";b:0;
s:10:"primaryKey";b:0;s:13:"autoIncrement";b:0;s:6:"binary";b:0;s:8:"unsigned";b:0;s:10:"hasDefault";b:0;s:11:"description";s:0:"";}
s:7:"URL_MD5";a:12:{s:4:"name";s:7:"url_md5";s:5:"scale";N;s:4:"type";s:7:"varchar";s:9:"maxLength";s:2:"32";s:10:"simpleType";s:1:"
C";s:7:"notNull";b:1;s:10:"primaryKey";b:0;s:13:"autoIncrement";b:0;s:6:"binary";b:0;s:8:"unsigned";b:0;s:10:"hasDefault";b:0;s:11:"
description";s:0:"";}}

 

可以看到,该缓存文件的开头是die函数,这样,即使有人猜到了url,并且该url又允许访问,他也只不过得到一个die结果而已,不会获取到缓存的真正内容。

 

另外,当读取的时候,还做了hash判断:

 

            $data = safe_file_get_contents($cacheFile);
            $hash = substr($data, 16, 32);
            $data = substr($data, 48);
            if (crc32($data) != $hash || strlen($hash) != 32) {
                return false;
            }

 

由于做了校验,这样如果有人动了缓存文件,那么该文件就会失效。

 

同时,注意到safe_file_get_contents的实现,使用了clearstatcache函数,清除有关文件的系统缓存(不过我也不知道这样有什么好处)。

 

 

对于缓存是否失效方面,是比较文件的mtime的。提供了两种方式,一种是比较mtime与当前时间的差是否大于给定的时间,另一种是检查mtime是否晚于给定时间。即,一个是给定时间差,一个是给定失效具体时间。

 

 

原创粉丝点击