首页 > php教程 > php手册 > php生成百度站点地图sitemap类函数

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-05-25 16:42:11
原创
1544 人浏览过

百度站点地图是百度工具中一个非常实用的功能,可以实时的让我们的网站给百度定时抓取,下面我们一起来看看由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

这样写的话就减轻了服务器的压力,下面贴出实现代码,风格有点乱,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

<?php

/*

 * SiteMap接口类

*/

class SitemapAction extends Action {

    private static $baseURL = &#39;&#39;; //URL地址

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

    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(&#39;Content-type:text/html;charset=utf-8&#39;);

        //获取问题列表

        $maxid = 0; //索引文件最大id

        $minid = 0; //索引文件最小id

        $psize = 1000; //数据库每次取数量

        $maxXml = 5000; //xml写入记录数量

        $where = array();

        //读取索引文件

        $index = APP_PATH . &#39;setmapxml/Index.txt&#39;;

        //关联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(&#39;,&#39;, $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 = emptyempty($arr[1]) ? 0 : $arr[1];

        $minid = emptyempty($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(

            &#39;filename&#39; => $filename,

            &#39;maxid&#39; => $maxid,

            &#39;minid&#39; => $minid,

            &#39;maxXml&#39; => $record

        );

        $start = &#39;<?xml version="1.0" encoding="UTF-8"  &#39; . 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 => http: //pic4.phprm.com/2014/08/20/http://pic4.phprm.com/2014/08/20/$qinfo.jpg.jpg){

            if ($k == 0) $indexArr[&#39;minid&#39;] = $qinfo[&#39;id&#39;];

            $qinfo[&#39;lastmod&#39;] = substr($qinfo[&#39;lasttime&#39;], 0, 10);

            $qinfo[&#39;mobielurl&#39;] = self::$askMobileUrl . $qinfo[&#39;id&#39;] . &#39;.html&#39;; //移动版链接

            $qinfo[&#39;pcurl&#39;] = self::$askPcUrl . $qinfo[&#39;id&#39;] . &#39;-p1.html&#39;; //pc版链接

            $xml.= $this->askMapMobileUrl($qinfo); //移动版

            $xml.= $this->askMapPcUrl($qinfo); //pc版

             

        }

        $maxid = end($list);

        $indexArr[&#39;maxid&#39;] = $maxid[&#39;id&#39;];

        //更新索引文件

        if ($bs == 0) {

            //更新最后一行

            $txt = file($index);

            $txt[count($txt) - 1] = $indexArr[filename] . &#39;,&#39; . $indexArr[maxid] . &#39;,&#39; . $indexArr[&#39;minid&#39;] . &#39;,&#39; . $indexArr[&#39;maxXml&#39;] . "\r\n";

            $str = join($txt);

            if (is_writable($index)) {

                if (!$handle = fopen($index, &#39;w&#39;)) {

                    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, &#39;a&#39;);

            $num = count($list);

            $string = $indexArr[filename] . &#39;,&#39; . $indexArr[maxid] . &#39;,&#39; . $indexArr[&#39;minid&#39;] . &#39;,&#39; . $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 = &#39;&#39;;

                foreach ($fileList as $v) {

                    $newContent.= $v;

                }

                if (!file_put_contents($askXml, $newContent)) exit(&#39;无法写入数据&#39;);

                echo &#39;已经写入文档&#39; . $askXml;

            }

            fclose($fp);

        }

        $filename = APP_PATH . &#39;setmapxml/&#39; . $filename . &#39;.xml&#39;;

        //更新到xml文件中,增加结尾

        if (!file_exists($filename)) file_put_contents($filename, $start);

        $xmlList = file($filename);

        $xmlCount = count($fileList);

        $xmlList[$xmlCount - 1] = $xml . "</urlset>";

        $newXml = &#39;&#39;;

        foreach ($xmlList as $v) {

            $newXml.= $v;

        }

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

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

    }

    //问答移动版xml

    private function askMapMobileUrl($data) {

        $xml = &#39;&#39;;

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

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

            if ($data[&#39;id&#39;]) $xml.= &#39;<loc>&#39; . $data[&#39;mobielurl&#39;] . &#39;</loc>&#39; . chr(10); //移动版链接

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

            if ($data[&#39;lastmod&#39;]) $xml.= &#39;<lastmod>&#39; . $data[&#39;lastmod&#39;] . &#39;</lastmod>&#39; . chr(10);

            $xml.= &#39;<changefreq>daily</changefreq>&#39; . chr(10);

            $xml.= &#39;<priority>0.8</priority>&#39; . chr(10);

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

            return $xml;

        }

    }

    //问答pc版xml

    private function askMapPcUrl($data) {

        $xml = &#39;&#39;;

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

            $xml.= &#39;<url>&#39; . chr(10);

            if ($data[&#39;id&#39;]) $xml.= &#39;<loc>&#39; . $data[&#39;pcurl&#39;] . &#39;</loc>&#39; . chr(10); //pc版链接

            if ($data[&#39;lastmod&#39;]) $xml.= &#39;<lastmod>&#39; . $data[&#39;lastmod&#39;] . &#39;</lastmod>&#39; . chr(10);

            $xml.= &#39;<changefreq>daily</changefreq>&#39; . chr(10);

            $xml.= &#39;<priority>0.8</priority>&#39; . chr(10);

            $xml.= &#39;</url>&#39; . chr(10);

            return $xml;

        }

    }

    //setmaps索引文件

    private function setMapIndex($filename) {

        $xml = &#39;&#39;;

        $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索引文件格式,代码如下:

1

2

3

4

5

6

7

8

9

10

11

<?xml version="1.0"  encoding="UTF-8" 

<sitemapindex>

<sitemap>

<loc>http://www.phprm.com/ask/setmapxml/0.xml</loc>

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

</sitemap>

<sitemap>

<loc>http://www.phprm.com/ask/setmapxml/1.xml</loc>

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

</sitemap>

</sitemapindex>

登录后复制

xml文件格式,每个文件需要存储5000条、现展示1条例子,实例代码如下:

1

2

3

4

5

6

7

8

9

10

11

<?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>

登录后复制


本文地址:

转载随意,但请附上文章地址:-)

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板