* 分类少一次读出,商品太多,每200跳转一次, 用crontab访问一次即更新 */
/* 如果使用,文中的xml格式最好不要改,控制器输出的时候加上xml头 */
/* author: kyoralk */
public function actionSiteMap()
{
$xml_file= '../themes/'.param('theme').'/views/site/sitemap.xml';
$final_id = getValue('final');
if(empty($final_id))
$file_content = file_get_contents('SitemapModel.php');
else
$file_content = file_get_contents($xml_file);
if(file_exists($xml_file))
$xml_time = filectime($xml_file);
#处理时间超过了2分钟了,立即停止, 放置堵数据库;短时间内不允许重复访问改写
if(($xml_time && (time()-$xml_time <= 120)) || empty($xml_time) || ($xml_time && time()-$xml_time >=420) )
{
if(empty($final_id))
{
# 分类一次读出
$criteria_cate = new CDbCriteria();
$criteria_cate->select = 'CateId';
$criteria_cate->addColumnCondition(array('IsShow'=>1));
$Category = Category::model()->findAll($criteria_cate);
if($Category)
{
foreach ($Category as $key => $value) {
$file_content .= '
<url>
<loc>'.abu(url('category/index', array('id'=>$value->CateId))).'</loc>
<lastmod>'.date('Y-m-d').'</lastmod>
<priority>0.80</priority>
<changefreq>hourly</changefreq>
</url>
';
}
}
}
# 商品分别取出
$criteria = new CDbCriteria();
$criteria->select = 'GoodsId';
$criteria->addColumnCondition(array('IsOnSale'=>1));
if($final_id)
$criteria->addCondition('GoodsId > '.$final_id);
$criteria->limit = 200;
$criteria->order = 'GoodsId ASC';
$Goods = Goods::model()->findAll($criteria);
if($Goods)
{
foreach($Goods as $g)
{
$file_content .= '
<url>
<loc>'.abu(url('goods/view', array('id'=>$g->GoodsId))).'</loc>
<lastmod>'.date('Y-m-d').'</lastmod>
<priority>0.80</priority>
<changefreq>hourly</changefreq>
</url>
';
$final_id = $g->GoodsId;
}
file_put_contents($xml_file, $file_content);
echo 'loading......';
echo '<script>window.location.href="'.url('crontab/sitemap', array('final'=>$final_id)).'"</script>';
}else{
$file_content .= '</urlset>';
file_put_contents($xml_file, $file_content);
echo 'end';
}
}else
{
$file_content .= '</urlset>';
file_put_contents($xml_file, $file_content);
echo 'time too long , force to stop';
}
}