php生成百度sitemap站点地图类函数实例2.docx
- 文档编号:29640204
- 上传时间:2023-07-25
- 格式:DOCX
- 页数:7
- 大小:17.15KB
php生成百度sitemap站点地图类函数实例2.docx
《php生成百度sitemap站点地图类函数实例2.docx》由会员分享,可在线阅读,更多相关《php生成百度sitemap站点地图类函数实例2.docx(7页珍藏版)》请在冰豆网上搜索。
php生成XXsitemap站点地图类函数实例2
php生成XXsitemap站点地图类函数实例_
问题概述:
公司网站是问答百科的网站、seo工程师提出需求说依据网站的问题来生成xml文件。
每个xml文件包含5000条setmap格式数据。
现在线上网站大约有70w条问题,所以说基本生成140个xml文件。
还有一个索引文件。
比如文件的名称以数字开头的。
索引文件包含的内容就是每个xml文件的路径还著名称。
为什么要每个文件存储5000条数据呢,由于这是mysql的一个界限值、假如每次取多了以后可能会对线上用户访问造成影响,或者速度变慢。
每个文件存储5000条数据,但是mysqlselsect的时候不能每次取5000条、现在写的是每次取1000条。
那这样规律就有点简单。
实现方法:
首先取出1000条数据(可以敏捷些成活的,便利以后修改),然后循环生成xml格式文件。
file_puts_contens写入文件。
然后再把生成的xml文件名称、取出问题的最小id、取出问题的最大id、取出问题的条数写出一个索引查询的txt文件当中,格式也许是这个样子的。
0,3146886,3145887,1000
发觉最终面的条数是1000了吗、第一次select取出1000条数据、然后写入0.xml文件当中。
把取出的xml文件名称、最小id、最大id、条数写入到索引查询txt中。
第一次写入了1000条数据到0.xml、生成条数为1000。
其次次查询的时候select语句会成为。
whereid取出的最大id(当前mysql为正序查询、假如为倒序、改成小于)limit1000这样的话又取出1000、然后修改索引查询txt的最小id、最大id、生成条数加到2021。
以此类推等生成条数到了5000的时候再另起一行写入索引文件、类似这样
0,3146886,3145887,5000
1,3148886,3147887,1000
这样写的话就减轻了服务器的压力。
下面贴出实现代码(风格有点乱):
具体功能代码如下:
代码如下:
?
php
/*
*SiteMap接口类
*/
classSitemapActionextendsAction{
privatestatic$baseURL='';//URL地址
privatestatic$askMobileUrl='l;charset=utf-8');
//猎取问题列表
$maxid=0;//索引文件最大id
$minid=0;//索引文件最小id
$psize=1000;//数据库每次取数量
$maxXml=5000;//xml写入记录数量
$where=array();
//读取索引文件
$index=APP_PATH.'setmapxml/Index.txt';
//关联setmaps路径
$askXml="../siteditu/ask/ask.xml";
if(!
file_exists($index)){
$fp=fopen("$index","w+");
if(!
is_writable($index)){
die("文件:
".$index."不行写,请检查!
");
}
fclose($fp);
}else{
//index.txt文件说明0:
xml文件名称(从1开头)、1:
文件最大id、2:
文件最小id、3:
文件当前记录数
$fp=file($index);
$string=$fp[count($fp)-1];//显示最终一行
$arr=explode(',',$string);
}
//索引文件数量是否小于$maxXml
//假如为第一次运行
if(!
$arr[1]){
$bs=1;
$filename=0;
}else{
if($arr$arr[3]$maxXml){
$filename=$arr[0];
$psize=$maxXml-$arr[3]$psize?
$psize:
($maxXml-$arr[3]);
$bs=0;
}else{
$filename=$arr[0]+1;
$bs=1;
}
}
$maxid=empty($arr[1])?
0:
$arr[1];
$minid=empty($arr[2])?
0:
$arr[2];
echo"文件名称:
".$filename.".xml"."br/";
echo"最大id:
".$maxid."br/";
echo"最小id:
".$minid."br/";
echo"xml写入最大记录:
".$maxXml."br/";
echo"数据库每次读取数量:
".$psize."br/";
$list=self:
:
$questionObj-getQuestionSetMap($where,$maxid,$psize);
if(count($list)=0){
echo1;exit;
}
$record=$arr[3]+count($list);//索引文件写入记录数
$indexArr=array('filename'=$filename,'maxid'=$maxid,'minid'=$minid,'maxXml'=$record);
$start='?
xmlversion="1.0"encoding="UTF-8"?
'.chr(10);
$start.="urlsetxmlns=""xmlns:
mobile=");
$start.="/urlset";
foreach($listas$k=$qinfo){
if($k==0)
$indexArr['minid']=$qinfo['id'];
$qinfo['lastmod']=substr($qinfo['lasttime'],0,10);
$qinfo['mobielurl']=self:
:
$askMobileUrl.$qinfo['id'].'.html';//移动版链接
$qinfo['pcurl']=self:
:
$askPcUrl.$qinfo['id'].'-p1.html';//pc版链接
$xml.=$this-askMapMobileUrl($qinfo);//移动版
$xml.=$this-askMapPcUrl($qinfo);//pc版
}
$maxid=end($list);
$indexArr['maxid']=$maxid['id'];
//更新索引文件
if($bs==0){
//更新最终一行
$txt=file($index);
$txt[count($txt)-1]=$indexArr[filename].','.$indexArr[maxid].','.$indexArr['minid'].','.$indexArr['maxXml']."rn";
$str=join($txt);
if(is_writable($index)){
if(!
$handle=fopen($index,'w')){
echo"不能打开文件$index";exit;
exit;
}
if(fwrite($handle,$str)===FALSE){
echo"不能写入到文件$index";exit;
exit;
}
echo"胜利地写入文件$index";
fclose($handle);
}else{
echo"文件$index不行写";exit;
}
fclose($index);
}elseif($bs==1){
//新加入一行
$fp=fopen($index,'a');
$num=count($list);
$string=$indexArr[filename].','.$indexArr[maxid].','.$indexArr['minid'].','.$num."rn";
if(fwrite($fp,$string)===false){
echo"追加新行失败。
。
。
";exit;
}else{
echo"追加胜利br/";
//更新sitemap索引文件
$xmlData="?
xmlversion="1.0"encoding="UTF-8"?
".chr(10);
$xmlData.="sitemapindex".chr(10);
$xmlData.="/sitemapindex";
if(!
file_exists($askXml))
file_put_contents($askXml,$xmlData);
$fileList=file($askXml);
$fileCount=count($fileList);
$setmapxml="正常问题链接
$txt=$this-setMapIndex($setmapxml);
$fileList[$fileCount-1]=$txt."/sitemapindex";
$newContent='';
foreach($fileListas$v){
$newContent.=$v;
}
if(!
file_put_contents($askXml,$newContent))exit('无法写入数据');
echo'已经写入文档'.$askXml;
}
fclose($fp);
}
$filename=APP_PATH.'setmapxml/'.$filename.'.xml';
//更新到xml文件中,增加结尾
if(!
file_exists($filename))
file_put_contents($filename,$start);
$xmlList=file($filename);
$xmlCount=count($fileList);
$xmlList[$xmlCount-1]=$xml."/urlset";
$newXml='';
foreach($xmlListas$v){
$newXml.=$v;
}
if(!
file_put_contents($filename,$newXml))exit("写入数据错误");
else
echo"写入数据胜利br/";
}
//问答移动版xml
privatefunctionaskMapMobileUrl($data){
$xml='';
if(is_array($data)!
empty($data)){
$xml.="url".chr(10);
if($data['id'])
$xml.='loc'.$data['mobielurl'].'/loc'.chr(10);//移动版链接
$xml.="mobile:
mobiletype="mobile"/".chr(10);
if($data['lastmod'])
$xml.='lastmod'.$data['lastmod'].'/lastmod'.chr(10);
$xml.='changefreqdaily/changefreq'.chr(10);
$xml.='priority0.8/priority'.chr(10);
$xml.="/url".chr(10);
return$xml;
}
}
//问答pc版xml
privatefunctionaskMapPcUrl($data){
$xml='';
if(is_array($data)!
empty($data)){
$xml.='url'.chr(10);
if($data['id'])
$xml.='loc'.$data['pcurl'].'/loc'.chr(10);//pc版链接
if($data['lastmod'])
$xml.='lastmod'.$data['lastmod'].'/lastmod'.chr(10);
$xml.='changefreqdaily/changefreq'.chr(10);
$xml.='priority0.8/priority'.chr(10);
$xml.='/url'.chr(10);
return$xml;
}
}
//setmaps索引文件
privatefunctionsetMapIndex($filename){
$xml='';
$xml.="sitemap".chr(10);
$xml.="loc{$filename}/loc".chr(10);
$xml.="lastmod".date("Y-m-d",time())."/lastmod".chr(10);
$xml.="/sitemap".chr(10);
return$xml;
}
}
?
xml索引文件格式如下:
代码如下:
?
xmlversion="1.0"encoding="UTF-8"?
sitemapindex
sitemap
locl/loc
mobile:
mobiletype="mobile"/
lastmod2021-01-11/lastmod
changefreqdaily/changefreq
priority0.8/priority
/url
url
/urlset
至于sql代码主要就是一个select语句,这里就不贴出来了。
更多信息请查看IT技术专栏
...
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- php 生成 百度 sitemap 站点 地图 函数 实例