动态拆分网站地图


Dynamic splitting the sitemaps

我已经按照本指南创建了一个动态XML站点地图。其中包括从数据库获取记录&从数据库中的URL生成XML。但我需要扩展这个&只要XML大于10MB或超过50000个URL,就创建一个站点地图索引。下面是我正在使用的代码。

header ("Content-type: text/xml");
echo ("<?xml version='"1.0'" encoding='"utf-8'"?>'n");
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <? while($current_post = mysql_fetch_array($blogs)) { ?>
      <url>
         <loc><?= $current_post[url]) ?></loc>
         <lastmod><?= gmdate(DATE_ATOM, $current_post[timestamp]) ?></lastmod>
      </url>
   <? } ?>
</urlset>

任何帮助或指南来拆分这&当URL计数超过50000或文件大小变大时,加入网站地图索引(感谢10MB)将非常有用。谢谢假设将总记录除以50000可以得到所需的sitemap_index文件的数量。但仍难以将其拆分10MB。

使用SELECT COUNT(*) FROM table获取记录计数,并输出位置(loc)类似于http://www.domain.tld/sitemap.php?offset=50000的站点地图索引。在对部件的单个请求中,使用MySQL语句中的LIMIT子句。

对于动态生成的网站地图中的10MB限制,我建议计算一个元素的最大大小,并将其用作网站地图中记录数的限制。

我认为在不预先生成站点地图文件(cronjob)的情况下,执行10MB限制不是一个好方法。在cronjob中,您可以开始生成第一个索引文件,并存储您写入的字节数/元素数。如果其中一个数字过大,则启动下一个文件。将所有生成的文件存储在一个数组中,使用该数组写入索引文件。

与其计算0-50000条记录需要多少字节(下一步),不如计算0-30000条,这是一个更安全的限制,一个包含30000个URL的文件大小将为5-7MB。

5-7MB大小的站点地图是好的,因为它不会使您的服务器过载。此外,你可以压缩网站地图文件(至少对于谷歌)。