让我们快速创建该应用程序:
- 创建一些模板 XML,您可以在其中添加网站。
- 在 a和 a
$websites
的帮助下分块NoRewindIterator
LimitIterator
让我们从第二点开始,创建这个伪造的 URL 和 XML,看看这是否容易连接:
$limit = 3;
$urls = new ArrayIterator(range(0, 9)); // 10 Fake URLs
$urls->rewind();
$it = new NoRewindIterator($urls);
首先,我们为每个文件设置一个限制(这里为三个以保持较低的测试),然后我们为 URL 设置数据源。这里有 10 个假 URL,只是从 0 到 9 的数字。
这些 URL 被回绕是因为它们随后被包装成 aNoRewindIterator
并且永远不会回绕,但我们想回绕数据源一次(这不是所有迭代器都需要的,但对于相当多的迭代器来说,我们这样做是正确的)。
倒带操作被 阻止,NoRewindIterator
这样我们就可以继续获得 X 大小的块$limit
。这正是现在所做的:
$fileCounter = 0;
while ($it->valid()) {
$fileCounter++;
printf("File %d:\n", $fileCounter);
$websites = new LimitIterator($it, 0, $limit);
foreach($websites as $website) {
printf(" * Website: %s\n", $website);
}
}
只要$it
有效(阅读:只要有要输出的 URL),就会创建一个新文件(从一个开始),然后通过LimitIterator
. 当该迭代完成时,它会继续进行,直到所有网站 URL 都已被使用。输出如下:
File 1:
* Website: 0
* Website: 1
* Website: 2
File 2:
* Website: 3
* Website: 4
* Website: 5
File 3:
* Website: 6
* Website: 7
* Website: 8
File 4:
* Website: 9
到目前为止,这显示了如何进行分块(或者有时这也称为分页)。如示例所示,仅缺少有关创建 XML 文档的部分。
要创建 XML 文档,您可以连接一个字符串,但是我们不这样做。我们使用现有的库来完美地完成这一切。该库称为 DOMDocument,下面是一个示例,如何在 urlset 中创建具有两个示例位置的站点地图文件:
$doc = new DOMDocument();
$doc->formatOutput = TRUE;
$nsUri = 'http://www.sitemaps.org/schemas/sitemap/0.9';
$urlset = $doc->appendChild($doc->createElementNS($nsUri, 'urlset'));
$url = $doc->createElementNS($nsUri, 'url');
$location = $url->appendChild($doc->createElementNS($nsUri, 'loc', 'BASEURL'));
$priority = $url->appendChild($doc->createElementNS($nsUri, 'priority', '1'));
$urlset->appendChild(clone $url);
$priority->nodeValue = '0.5';
$location->nodeValue = 'TEST';
$urlset->appendChild(clone $url);
echo $doc->saveXML();
此代码示例展示了如何创建文档,然后如何将元素及其适当的命名空间添加到其中。它还展示了如何创建<url>
可以通过克隆轻松修改和添加的样板元素。
这个例子的输出是:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>BASEURL</loc>
<priority>1</priority>
</url>
<url>
<loc>TEST</loc>
<priority>0.5</priority>
</url>
</urlset>
所以现在所有的普遍问题都已经解决了。所需要的只是将这两者连接在一起并存储到磁盘上。为了这个例子,我省略了后面的部分(你只需将文件名作为参数传递给saveXML
)并输出 XML:
<?php
/**
* Save Sitemap XML Files Limit by 1000 URLs per each File
*
* @link https://stackoverflow.com/q/19750485/367456
*/
$limit = 3;
$urls = new ArrayIterator(range(0, 9)); // 10 Fake URLs
$urls->rewind();
$it = new NoRewindIterator($urls);
$fileCounter = 0;
$baseDoc = new DOMDocument();
$baseDoc->formatOutput = TRUE;
$nsUri = 'http://www.sitemaps.org/schemas/sitemap/0.9';
while ($it->valid()) {
$fileCounter++;
$doc = clone $baseDoc;
$urlset = $doc->appendChild($doc->createElementNS($nsUri, 'urlset'));
$url = $doc->createElementNS($nsUri, 'url');
$location = $url->appendChild($doc->createElementNS($nsUri, 'loc', 'BASEURL'));
$priority = $url->appendChild($doc->createElementNS($nsUri, 'priority', '1'));
$urlset->appendChild(clone $url);
$priority->nodeValue = '0.5';
printf("File %d:\n", $fileCounter);
$websites = new LimitIterator($it, 0, $limit);
foreach ($websites as $website) {
$location->nodeValue = $website;
$urlset->appendChild(clone $url);
}
echo $doc->saveXML();
}
然后输出是 XML 而不是纯文本:
File 1:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>BASEURL</loc>
<priority>1</priority>
</url>
<url>
<loc>0</loc>
<priority>0.5</priority>
</url>
<url>
<loc>1</loc>
<priority>0.5</priority>
</url>
<url>
<loc>2</loc>
<priority>0.5</priority>
</url>
</urlset>
File 2:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>BASEURL</loc>
<priority>1</priority>
</url>
<url>
<loc>3</loc>
<priority>0.5</priority>
</url>
<url>
<loc>4</loc>
<priority>0.5</priority>
</url>
<url>
<loc>5</loc>
<priority>0.5</priority>
</url>
</urlset>
File 3:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>BASEURL</loc>
<priority>1</priority>
</url>
<url>
<loc>6</loc>
<priority>0.5</priority>
</url>
<url>
<loc>7</loc>
<priority>0.5</priority>
</url>
<url>
<loc>8</loc>
<priority>0.5</priority>
</url>
</urlset>
File 4:
<?xml version="1.0"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>BASEURL</loc>
<priority>1</priority>
</url>
<url>
<loc>9</loc>
<priority>0.5</priority>
</url>
</urlset>
因此,现在剩下要做的就是在开始时将原始数据源作为迭代器提供,将 URL 的数量(限制)增加到您自己的值,并为每个添加正确的 Base-URL每个文件(如果你真的需要的话)。
就 XML 站点地图而言,您还可以创建一个文件来链接其他文件。与以下相比,IIRC 的限制要高一些:多个站点地图:robots.txt 中的条目?.
我希望这可以帮助您以一种成熟的方式实现您正在寻找的东西。