1,关于文件的静态缓存tp3有内置的F方法。
F方法他在公共函数库文件function.php里面
格式如下:
/**
* 快速文件数据读取和保存 针对简单类型数据 字符串、数组
* @param string $name 缓存名称
* @param mixed $value 缓存值
* @param string $path 缓存路径
* @return mixed
*/
function F($name, $value='', $path=DATA_PATH) {
static $_cache = array();
$filename = $path . $name . '.php';
if ('' !== $value) {
if (is_null($value)) {
// 删除缓存
if(false !== strpos($name,'*')){
return false; // TODO
}else{
unset($_cache[$name]);
return Think\Storage::unlink($filename,'F');
}
} else {
Think\Storage::put($filename,serialize($value),'F');
// 缓存数据
$_cache[$name] = $value;
return null;
}
}
// 获取缓存数据
if (isset($_cache[$name]))
return $_cache[$name];
if (Think\Storage::has($filename,'F')){
$value = unserialize(Think\Storage::read($filename,'F'));
$_cache[$name] = $value;
} else {
$value = false;
}
return $value;
}
后面文件名可不写,则默认缓存到ThinkPHP的运行文件夹Rutime的文件夹Data里面,可直接读取缓存信息
F(‘site_config’,data是表单提交过来的数据
data,APP_PATH.‘Common/Conf/’);
$data = F(’…/…/Common/Conf/site_config’);
2,生成静态页面的buildHtml方法
buildHtml方法 在ThinkPHP框架文件夹controller.php文件里
/**
* 创建静态页面
* @access protected
* @htmlfile 生成的静态文件名称
* @htmlpath 生成的静态文件路径
* @param string $templateFile 指定要调用的模板文件
* 默认为空 由系统自动定位模板文件
* @return string
* protected function buildHtml($htmlfile='',$htmlpath='',$templateFile='') {
*/
它的使用也极其简单,以首页生成静态页面为例,有三个步骤:
(1),修改配置文件conf.php,开启静态生成文件后缀名为.html
‘HTML_FILE_SUFFIX’ => ‘.html’,//设置静态生成文件的文件名后缀为html
(2),设置在index.php设置HTML_PATH,如
define(‘HTML_PATH’,’./’);//此为生成首页静态页面的根目录
(3),gei首页index方法加个参数且默认为空,
index(type=''){
//写在方法末尾00000
//当index方法参数为buildHtml是执行生成静态页面
if(type=‘buildHtml’){
$this->buildHtml('index',HTML_PATH,'Index/index');
else {
$this->display();
}
}
//写个方法用来在后台手动控制生成静态页面
public function build_html() {
$this->index('buildHtml');
$this->ajaxReturn('OK');
}
3,生成静态页面还要解决用户操作信息及时反馈,即计数器及时更新静态页面的信息
(1),写前台模板,导入计数器文件
<dd class="news-info">
{$vo.keywords} <span>{$vo.add_time|date="Y-m-d H:i:s",###}</span> 阅读(<i news-id="{$vo.id}" class="news_count node-{$vo.id}">{$vo.count}</i>)
</dd>
<script src="__PUBLIC_HOME__/js/count.js"></script>
(2),计数器文件方法实现阅读时更新,与后台交互
/**
* 计数器JS文件
*/
var newsIds = {};
$(".news_count").each(function(i){
newsIds[i] = $(this).attr("news-id");
});
//调试
//console.log(newsIds);
url = "/index/getCount";
$.post(url, newsIds, function(result){
if(result.status == 1) {
counts = result.data;
$.each(counts, function(id,count){
$(".node-"+id).html(count);
});
}
}, "JSON");
(3),后台操作方法
public function getCount() {
if(!$_POST) {
$this->ajaxReturn('没有任何内容');
}
$newsIds = array_unique($_POST);
try{
$list = $this->getNewsByNewsIdIn($newsIds);
}catch (Exception $e) {
$this->ajaxReturn($e->getMessage());
}
if(!$list) {
$this->ajaxReturn('没有数据');
}
$data = array();
foreach($list as $k=>$v) {
$data[$v['id']] = $v['count'];
}
$this->ajaxReturn(array('status'=>1,'data'=>$data));
}
4,定时执行任务生成静态页面和备份数据库
就是通过脚本定时执行生成静态页面和备份数据库的方法
(1),自动生成静态页面,定义常量标记是否为计划任务脚本,同样在根目录下的index.php入口文件中
define(‘APP_CRONTAB’, 1);
然后操作方法(写前台控制器那个从之前都行,比如index控制器)
public function crontab_build_html() {
if(APP_CRONTAB != 1) {//在index.php里面,
die("the_file_must_exec_crontab");
}
$result = F('../../Common/Conf/site_config');
if(!$result['cacheindex']) {//后台设置单选框name属性值,如
**
<label><input type="radio" name="cacheindex" value="1" <if condition="$data.cacheindex eq 1">checked</if>> 开启</label>
<label><input type="radio" name="cacheindex" value="0" <if condition="$data.cacheindex neq 1">checked</if>> 关闭</label>
*/
die('系统没有设置开启自动生成首页缓存的内容');
}
$this->index('buildHtml');
}
(2),自动备份数据库,定义常量标记是否为计划任务脚本,同样在根目录下的index.php入口文件中
新建个cron.php类执行数据库备份任务
<?php
namespace Admin\Controller;
use Think\Controller;
use Think\Upload;
/**
* 后台计划任务 业务脚本
*/
class CronController {
public function dumpmysql() {
$result = F('../../Common/Conf/site_config');
if(!$result['dumpmysql']) {//后台设置单选框name属性值,如
?**
<label><input type="radio" name="dumpmysql" value="1" <if condition="$data.dumpmysql eq 1">checked</if>> 开启</label>
<label><input type="radio" name="dumpmysql" value="0" <if condition="$data.dumpmysql neq 1">checked</if>> 关闭</label>
*/
die("系统没有设置开启自动备份数据库的内容");
}
$shell = "mysqldump -u".C("DB_USER")." " .C("DB_NAME")." > /tmp/cms".date("Ymd").".sql";
exec($shell);
}
}
我们可以用命令行的形式启用这些定时任务,当然更简便方法是用宝塔面板执行