php如何生成站点地图 百度sitemap接口类函数实例代码
分类:PHP_Python| 发布:llmaomi| 查看:337 | 发表时间:2015/1/31
本文实例讲述了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
这样写的话就减轻了服务器的压力。
下面贴出实现代码(风格有点乱):
具体功能代码如下:
代码如下:
006 | class SitemapAction extends Action{ |
007 | private static $baseURL = '' ; |
013 | public function askSetMap(){ |
014 | header( 'Content-type:text/html;charset=utf-8' ); |
022 | $index = APP_PATH. 'setmapxml/Index.txt' ; |
024 | $askXml = "../siteditu/ask/ask.xml" ; |
025 | if (! file_exists ( $index )){ |
026 | $fp = fopen ( "$index" , "w+" ); |
027 | if ( ! is_writable ( $index ) ){ |
028 | die ( "文件:" . $index . "不可写,请检查!" ); |
034 | $string = $fp [ count ( $fp )-1]; |
035 | $arr = explode ( ',' , $string ); |
043 | if ( $arr && $arr [3]< $maxXml ){ |
045 | $psize = $maxXml - $arr [3]> $psize ? $psize :( $maxXml - $arr [3]); |
048 | $filename = $arr [0]+1; |
052 | $maxid = empty ( $arr [1])?0: $arr [1]; |
053 | $minid = empty ( $arr [2])?0: $arr [2]; |
054 | echo "文件名称:" . $filename . ".xml" . "<br/ >" ; |
055 | echo "最大id:" . $maxid ." |
057 | echo "最小id:" . $minid ." |
059 | echo "xml写入最大记录:" . $maxXml ." |
061 | echo "数据库每次读取数量:" . $psize ." |
063 | $list = self:: $questionObj ->getQuestionSetMap( $where , $maxid , $psize ); |
067 | $record = $arr [3]+ count ( $list ); |
068 | $indexArr = array ( 'filename' => $filename , 'maxid' => $maxid , 'minid' => $minid , 'maxXml' => $record ); |
069 | $start = '<?xml version="1.0" encoding="UTF-8" ?> ' . chr (10); |
072 | foreach ( $list as $k => $qinfo ){ |
074 | $indexArr [ 'minid' ]= $qinfo [ 'id' ]; |
075 | $qinfo [ 'lastmod' ] = substr ( $qinfo [ 'lasttime' ],0,10); |
076 | $qinfo [ 'mobielurl' ] = self:: $askMobileUrl . $qinfo [ 'id' ]. '.html' ; |
077 | $qinfo [ 'pcurl' ] = self:: $askPcUrl . $qinfo [ 'id' ]. '-p1.html' ; |
078 | $xml .= $this ->askMapMobileUrl( $qinfo ); |
079 | $xml .= $this ->askMapPcUrl( $qinfo ); |
082 | $indexArr [ 'maxid' ] = $maxid [ 'id' ]; |
087 | $txt [ count ( $txt )-1] = $indexArr [filename]. ',' . $indexArr [maxid]. ',' . $indexArr [ 'minid' ]. ',' . $indexArr [ 'maxXml' ]. "\r\n" ; |
089 | if ( is_writable ( $index )) { |
090 | if (! $handle = fopen ( $index , 'w' )) { |
091 | echo "不能打开文件 $index" ; exit ; |
094 | if (fwrite( $handle , $str ) === FALSE) { |
095 | echo "不能写入到文件 $index" ; exit ; |
098 | echo "成功地写入文件$index" ; |
101 | echo "文件 $index 不可写" ; exit ; |
106 | $fp = fopen ( $index , 'a' ); |
108 | $string = $indexArr [filename]. ',' . $indexArr [maxid]. ',' . $indexArr [ 'minid' ]. ',' . $num . "\r\n" ; |
109 | if (fwrite( $fp , $string )===false){ |
110 | echo "追加新行失败。。。" ; exit ; |
115 | $xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" . chr (10); |
116 | $xmlData .= "<sitemapindex>" . chr (10); |
117 | $xmlData .= "</sitemapindex>" ; |
118 | if (! file_exists ( $askXml )) |
119 | file_put_contents ( $askXml , $xmlData ); |
120 | $fileList = file( $askXml ); |
121 | $fileCount = count ( $fileList ); |
123 | $txt = $this ->setMapIndex( $setmapxml ); |
124 | $fileList [ $fileCount -1]= $txt . "</sitemapindex>" ; |
126 | foreach ( $fileList as $v ){ |
129 | if (! file_put_contents ( $askXml , $newContent )) exit ( '无法写入数据' ); |
130 | echo '已经写入文档' . $askXml ; |
134 | $filename = APP_PATH. 'setmapxml/' . $filename . '.xml' ; |
136 | if (! file_exists ( $filename )) |
137 | file_put_contents ( $filename , $start ); |
138 | $xmlList = file( $filename ); |
139 | $xmlCount = count ( $fileList ); |
140 | $xmlList [ $xmlCount -1]= $xml . "</urlset>" ; |
142 | foreach ( $xmlList as $v ){ |
145 | if (! file_put_contents ( $filename , $newXml )) exit ( "写入数据错误" ); |
151 | private function askMapMobileUrl( $data ){ |
153 | if ( is_array ( $data )&&! empty ( $data )){ |
154 | $xml .= "<url>" . chr (10); |
156 | $xml .= '<loc>' . $data [ 'mobielurl' ]. '</loc>' . chr (10); |
157 | $xml .= "<mobile:mobile type=\"mobile\"/>" . chr (10); |
159 | $xml .= '<lastmod>' . $data [ 'lastmod' ]. '</lastmod>' . chr (10); |
160 | $xml .= '<changefreq>daily</changefreq>' . chr (10); |
161 | $xml .= '<priority>0.8</priority>' . chr (10); |
162 | $xml .= "</url>" . chr (10); |
167 | private function askMapPcUrl( $data ){ |
169 | if ( is_array ( $data )&&! empty ( $data )){ |
170 | $xml .= '<url>' . chr (10); |
172 | $xml .= '<loc>' . $data [ 'pcurl' ]. '</loc>' . chr (10); |
174 | $xml .= '<lastmod>' . $data [ 'lastmod' ]. '</lastmod>' . chr (10); |
175 | $xml .= '<changefreq>daily</changefreq>' . chr (10); |
176 | $xml .= '<priority>0.8</priority>' . chr (10); |
177 | $xml .= '</url>' . chr (10); |
182 | private function setMapIndex( $filename ){ |
184 | $xml .= "<sitemap>" . chr (10); |
185 | $xml .= "<loc>{$filename}</loc>" . chr (10); |
186 | $xml .= "<lastmod>" . date ( "Y-m-d" ,time()). "</lastmod>" . chr (10); |
187 | $xml .= "</sitemap>" . chr (10); |
xml索引文件格式如下:
代码如下:
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
05 | < lastmod >2014-05-12</ lastmod > |
09 | < lastmod >2014-05-12</ lastmod > |
xml文件格式(每个文件需要存储5000条、现展示1条例子)
代码如下:
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
05 | < mobile:mobile type = "mobile" /> |
06 | < lastmod >2013-01-11</ lastmod > |
07 | < changefreq >daily</ changefreq > |
08 | < priority >0.8</ priority > |
至于sql代码主要就是一个select语句,这里就不贴出来了。
希望本文所述对大家的php程序设计有所帮助。