使用 PHP 动态创建站点地图 [重复]
Posted
技术标签:
【中文标题】使用 PHP 动态创建站点地图 [重复]【英文标题】:Sitemap Dynamic Creation with PHP [duplicate] 【发布时间】:2019-06-22 08:29:18 【问题描述】:我正在尝试使用 php 生成有效的站点地图。逻辑很简单。我将所有 ^(.+)index_sitemal.xml 请求转发到 .htaccess 中的 index_sitemap.php 文件。 PHP脚本如下:
<?php
header( "content-type: application/xml; charset=UTF-8" );
echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
$len = 10; // to take
$min = 50; // minimum
$max = 100; // maximum
$range = [];
foreach (range(0, $len - 1) as $i)
while(in_array($num = mt_rand($min, $max), $range));
$range[] = $num;
echo '<sitemap><loc>http://'.$_SERVER['SERVER_NAME'].'/sitemap/'.$num.'.xml</loc></sitemap>'."\n";
echo '</sitemapindex>';
?>
在浏览器中显示良好。
图片链接 - (抱歉,信誉不佳)https://i.ibb.co/4ZmLJ1D/Screenshot-at-Jan-29-10-47-01.png
但在尝试验证 xml 时出现类型错误。
图片链接 - (对不起,信誉低)https://i.ibb.co/Ws11cBj/Screenshot-at-Jan-29-10-55-28.png
有没有办法使用 php 显示动态站点地图?
【问题讨论】:
【参考方案1】:我之前遇到过类似的问题,但通过运行不同的 PHP 文件以使用 CRON 作业更新站点地图来解决它。
<?php
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlString .= '<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">';
$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';
$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/videos/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';
$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/contact/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';
$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/blog/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';
$sql = "SELECT * FROM categories";
$stmt = DB::run($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
$url = $row["url"];
$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/category/'.htmlentities($url).'/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';
$xmlString .= '</urlset>';
$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xmlString);
$dom->save('../sitemap.xml');
?>
编辑
<?php
$host = 'http://www.google.com/ping?sitemap=https://www.example.com/sitemap.xml';
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300)
echo 'success';
else
echo 'try again';
?>
【讨论】:
Paddy Hallihan 感谢您的回答!我需要配置 CRON 作业以先对其进行测试。但是你能告诉我这个脚本是生成静态的“../sitemap.xml”还是只显示而不保存? 您可以在浏览器中运行 PHP 文件进行测试,而无需设置 cron 作业,它应该保存 xml 文件。就我而言,我有一个包含所有脚本的 cron 文件夹,因此 XML 保存在主目录../sitemap.xml
中,因此您可能需要对此进行调整
实际的 XML 文件在保存时是静态的。但 CRON 作业将每小时/每天或您选择的任何时间重写它。
嗯,很奇怪,但我没有得到这个静态的 sitemap.xml。但无论如何,我明白了你的意思,并将朝着这个方向前进,谢谢。另一件事是如何显示它。我的意思是如果我保存它“$dom->save('../sitemap.xml');”那么我的 php 脚本将不会像最初计划的那样返回 xml 站点地图。
在这种情况下,我唯一能想到的就是我之前所说的使用../
进入一个目录并确保你有能力写入这个目录。此外,当它被保存时,我不需要显示它。我知道这个名字总是一样的,所以这就是我给谷歌搜索控制台的 URL。我还有另一个脚本,然后在一个单独的 cron 作业中 ping 谷歌说嘿这是一个新的站点地图(见编辑的答案)以上是关于使用 PHP 动态创建站点地图 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?