php生成百度sitemap站点地图类函数实例


Posted in PHP onOctober 17, 2014

本文实例讲述了php生成百度sitemap站点地图类函数的方法,分享给大家供大家参考。具体实现方法如下:

问题概述:

公司网站是问答百科的网站、seo工程师提出需求说根据网站的问题来生成xml文件。每个xml文件包含5000条setmap格式数据。现在线上网站大约有70w条问题,所以说基本生成140个xml文件。还有一个索引文件。比如文件的名称以数字开头的。索引文件包含的内容就是每个xml文件的路径还有名称。
为什么要每个文件存储5000条数据呢,因为这是mysql的一个界限值、如果每次取多了以后可能会对线上用户访问造成影响,或者速度变慢。每个文件存储5000条数据,但是mysql selsect的时候不能每次取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语句会成为。 where id > 取出的最大id(当前mysql为正序查询、如果为倒序、改成小于) limit 1000 这样的话又取出1000、然后修改索引查询txt的最小id、最大id、生成条数加到2000。以此类推等生成条数到了5000的时候再另起一行写入索引文件、类似这样
0,3146886,3145887,5000
1,3148886,3147887,1000
这样写的话就减轻了服务器的压力。
下面贴出实现代码(风格有点乱):

具体功能代码如下:

<?php

/*

 * SiteMap接口类

 */

 

class SitemapAction extends Action{

private static $baseURL = ''; //URL地址

private static $askMobileUrl = 'http://m.xxx.cn/ask/'; //问答移动版地址

private static $askPcUrl = "http://www.xxx.cn/ask/";   //问答pc地址

private static $askZonePcUrl = "http://www.xxx.cn/ask/jingxuan/"; //问答精选Pc链接

private static $askZoneMobileUrl = "http://m.xxx.cn/ask/jx/"; //问答精选移动版链接

        //问答setmaps

public function askSetMap(){

header('Content-type:text/html;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){

echo 1;exit;

}

$record = $arr[3]+count($list); //索引文件写入记录数

$indexArr = array('filename'=>$filename,'maxid'=>$maxid,'minid'=>$minid,'maxXml'=>$record);

$start = '<?xml version="1.0" encoding="UTF-8" ?> '.chr(10);

$start.="<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:mobile=\"http://www.baidu.com/schemas/sitemap-mobile/1/\">".chr(10);

                                $start.="</urlset>";

foreach($list as $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']."\r\n";

$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."\r\n";

if(fwrite($fp,$string)===false){

echo "追加新行失败。。。";exit;

}else{

echo "追加成功<br />";

//更新sitemap索引文件

$xmlData="<?xml version=\"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 = "http://www.xxx.cn/ask/setmapxml/{$filename}.xml";//正常问题链接

$txt = $this->setMapIndex($setmapxml);

$fileList[$fileCount-1]=$txt."</sitemapindex>";

$newContent = '';

foreach($fileList as $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($xmlList as $v){

$newXml.= $v;

}

if(!file_put_contents($filename, $newXml))exit("写入数据错误");

                else

                    echo "写入数据成功<br />";

}

//问答移动版xml

private function askMapMobileUrl($data){

$xml = '';

if(is_array($data)&&!empty($data)){

$xml .="<url>".chr(10);

if($data['id'])

$xml.='<loc>'.$data['mobielurl'].'</loc>'.chr(10);//移动版链接

$xml.="<mobile:mobile type=\"mobile\"/>".chr(10);

if($data['lastmod'])

$xml.='<lastmod>'.$data['lastmod'].'</lastmod>'.chr(10);

$xml.='<changefreq>daily</changefreq>'.chr(10);

$xml.='<priority>0.8</priority>'.chr(10);   

$xml.="</url>".chr(10);

return $xml;

}

}

//问答pc版xml

private function askMapPcUrl($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.='<changefreq>daily</changefreq>'.chr(10);

$xml.='<priority>0.8</priority>'.chr(10);

$xml.='</url>'.chr(10);

return $xml;

}

}

//setmaps索引文件

private function setMapIndex($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索引文件格式如下:
<?xml version="1.0"  encoding="UTF-8" ?>

<sitemapindex>

<sitemap>

<loc>http://www.xxx.cn/ask/setmapxml/0.xml</loc>

<lastmod>2014-05-12</lastmod>

</sitemap>

<sitemap>

<loc>http://www.xxx.cn/ask/setmapxml/1.xml</loc>

<lastmod>2014-05-12</lastmod>

</sitemap>

</sitemapindex>

 
xml文件格式(每个文件需要存储5000条、现展示1条例子)
<?xml version="1.0" encoding="UTF-8" ?> 

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">

<url>

<loc>http://m.xxx.cn/ask/7460.html</loc>

<mobile:mobile type="mobile"/>

<lastmod>2013-01-11</lastmod>

<changefreq>daily</changefreq>

<priority>0.8</priority>

</url>

<url>

</urlset>

 
至于sql代码主要就是一个select语句,这里就不贴出来了。

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php smarty模版引擎中的缓存应用
Dec 11 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
解析thinkphp基本配置 convention.php
Jun 18 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
ThinkPHP3.1的Widget新用法
Jun 19 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
php文件上传、下载和删除示例
Aug 28 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
php+mysql实现数据库随机重排实例
Oct 17 #PHP
php中spl_autoload详解
Oct 17 #PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
Oct 17 #PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 #PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 #PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 #PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 #PHP
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
2014/06/26 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
2016/08/01 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
vue父组件给子组件的组件传值provide inject的方法
2019/10/23 Javascript
Python实现简单登录验证
2016/04/13 Python
python实现发送邮件功能代码
2017/12/14 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
上班玩游戏检讨书
2014/02/07 职场文书
党员创先争优心得体会
2014/09/11 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python