0%

Php ghost 反向代理缓存网站

几年前就萌生了使用最广泛使用的php虚拟主机反向代理一些网站内容,并缓存到本地的想法,但是一直没有付诸行动。

关于运行环境的设想
1、兼容php5.2 - php7 优先使用php5.2开发。 以便适配廉价虚拟主机
2、缓存大小可以限制,以避免超出容量

关于缓存方案的设想
因为廉价虚拟主机 多数自带的mysql数据库很小,很多10-20M的,还有mysql的备份迁移多有不便,不太符合这里的需求。所以不打算才用mysql的方式缓存数据库。
设想过直接使用sqlite 作为索引 并做缓存使用。但是考虑到sqlite的高并发写入 经常出现文件锁死。所以暂时搁置这个方案。

折中方案
缓存保存方案
sqlite 读写分离 + 临时文件缓存 + 定时任务导入缓存到sqlite
缓存大小限制方案
1、sqlite限制 可以限制sqlite文件,文件过大不再保存数据,限制为0的话 不使用sqlite数据库。
2、临时缓存文件 总大小超过限制后 也不再保存数据。限制为0的话,不进行临时缓存。
3、临时缓存文件 文件数量 超过限制后 也不在保存,以免导致服务器io堵塞。为0 不限制文件数量。
sqlite和临时缓存总大小 都为0的情况下,不缓存 直接反代。
缓存更新方案
1、强制更新 访问地址中带正确的 lyh_key参数,即强制访问远程数据 并保存到sqlite 忽略容量限制和文件类型限制
2、自动更新 缓存时间过期后,删除数据库缓存,并请求最新远程文件到临时缓存
跳过文件方案
1、url中带指定字符的文件 只反代不保存缓存。例如 .zip .exe .jpg等 多个字符用 | 隔开
2、本地缓存已经有的
定时任务导入缓存文件方案
因为sqlite的高并发读取性能很好,但是高并发写入 容易导致文件锁死 ,所以这里采取 日常更新只保存到文件 并不会更新到数据库。定时任务触发后,批量读取本地文件 并导入到sqlite 然后清空临时缓存。
默认采取 前台输出script 调用php文件的方式,也可以另行使用Python 或其他方式加入到计划任务处理。
字符串替换方案
为方便管理 数据库和文件中 保存原始代码,不进行替换。前台输出的时候 进行替换。

加密方案

/_data 目录中保存sqlite文件
_blank_cache_list.db 空白缓存文件数据库
_site_id_cache_domain_com.db 对应的站点缓存数据
CREATE TABLE file (
md5 CHAR (32) PRIMARY KEY,
file BLOB (2147483647),
time TEXT
);

/_cache_temp 未录入缓存的数据
/site_id 对应站点id
_url(md5).file 对应的文件内容
_url(md5).txt url地址记录

定时任务
获取/_cache_temp/site_id/下所有txt文件 并读取里面的url和file内容 导入到_site_id_cache_domain_com.db
前台 script 触发

文件查询 先查询 sqlite数据库 没有的话 读取cache文件,依旧没有的话读取远程文件 并写入到cache