百度站点地图是百度工具中一个非常实用的功能,可以实时的让我们的网站给百度定时抓取,下面我们一起来看看由php生成的一个xml文档了.
公司网站是问答百科的网站、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
这样写的话就减轻了服务器的压力,下面贴出实现代码,风格有点乱,代码如下:
getquestionsetmap($where, $maxid, $psize); if (count($list) $filename, 'maxid' => $maxid, 'minid' => $minid, 'maxxml' => $record ); $start = ' http: //pic4.phprm.com/2014/08/20/http://pic4.phprm.com/2014/08/20/$qinfo.jpg.jpg){ 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 追加成功
; //更新sitemap索引文件 $xmldata = setmapindex($setmapxml); $filelist[$filecount - 1] = $txt . ; $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 . ; $newxml = ''; foreach ($xmllist as $v) { $newxml.= $v; } if (!file_put_contents($filename, $newxml)) exit(写入数据错误); else echo 写入数据成功
; } //问答移动版xml private function askmapmobileurl($data) { $xml = ''; if (is_array($data) && !emptyempty($data)) { $xml.= . chr(10); if ($data['id']) $xml.= '' . $data['mobielurl'] . '' . chr(10); //移动版链接 $xml.= . chr(10); if ($data['lastmod']) $xml.= '' . $data['lastmod'] . '' . chr(10); $xml.= 'daily' . chr(10); $xml.= '0.8' . chr(10); $xml.= . chr(10); return $xml; } } //问答pc版xml private function askmappcurl($data) { $xml = ''; if (is_array($data) && !emptyempty($data)) { $xml.= '' . chr(10); if ($data['id']) $xml.= '' . $data['pcurl'] . '' . chr(10); //pc版链接 if ($data['lastmod']) $xml.= '' . $data['lastmod'] . '' . chr(10); $xml.= 'daily' . chr(10); $xml.= '0.8' . chr(10); $xml.= '' . chr(10); return $xml; } } //setmaps索引文件 private function setmapindex($filename) { $xml = ''; $xml.= . chr(10); $xml.= {$filename} . chr(10); $xml.= . date(y-m-d, time()) . . chr(10); $xml.= . chr(10); return $xml; }}?>
xml索引文件格式,代码如下:
xml文件格式,每个文件需要存储5000条、现展示1条例子,实例代码如下:
本文地址:
转载随意,但请附上文章地址:-)
