需求: 从数据库查数据,生成一个xml文件,这个xml是 sitemap.xml格式的。
分析方法 : 有两种方法实现 1. 使用 DomDocument 2. 使用 fopen 操作文件
这篇讨论fopen 实现
public function fopenCreateSitemap(){
date_default_timezone_set('PRC');
set_time_limit(0);
$this->load->model('seo_model');
$dir = './';
$filename = 'sitemap.xml';
$file = $dir.$filename;
$domain = substr(base_url(),0,-1);
$step_num = 2; //目前需要两步,第一步走完int_a =1
$cur_step = 0;
$msg = '';
$crontab = $this->seo_model->getCrontabOne(array('name'=>'SITEMAP'));
if(empty($crontab)){
echo 0; exit;
}
//int_a 代表上次执行到哪一步了
if(empty($crontab['int_a']) || $crontab['int_a'] == 2){ //执行第一步
//如果是本次任务的第一步,则 备份/删除原xml, w+打开新文件,
if(file_exists($file)){
rename($file,$dir.date('YmdHis',time()).'_'.rand(1000,9999).'sitemap.xml');
$handle = fopen($file,'w+');
}else{
$handle = fopen($file,'w+');
}
//第一步准备信息, 首页,分类,发现的导航连接; 一级分类连接,二级分类连接,产品连接
$msg = $this->step1($domain);
$cur_step = 1;
}else if($crontab['int_a'] == 1){ //执行第二步
//如果是本次任务第二步,则 打开r+, fseek -9,
if(file_exists($file)){
$handle = fopen($file,'r+');
$res = fseek($handle,-10,SEEK_END);
}
//第二步; 发现
$msg = $this->step2($domain);
$cur_step = 2;
}
$res_f = fwrite($handle,$msg);
fclose($handle);
$res = $this->seo_model->updateCrontab(array('int_a'=>$cur_step),array('name'=>'SITEMAP'));
if($res_f !== FALSE && $res){
echo 1;exit;
}
}
这个方法在是 计划任务执行时的主要方法,xml 分两次调用 每次生成xml的一部分,这样可以避免php超时,和避免影响网站正常访问
注意 1. fopen 的a a+ 模式下 使用 fseek 是没用的
2. 写入文件中的中文 ,不用特别处理,就可以正常显示