我应该如何修改站点地图?



我有一个PHP脚本来构建站点地图(一个符合标准站点地图结构的XML文件(。

我的问题是关于改进它。作为您,网站每天都有新帖子。此外,帖子可以每小时/每天/每月或任何时候编辑几次。我有两种策略来处理这个问题:

  1. 制作一个新的PHP脚本,解析该XML文件并找到节点并在编辑帖子时对其进行修改,并在添加新帖子时添加新节点(在插入新节点之前需要计算所有节点的数量,因为站点地图文件最多可以有50,000个URL(。

  2. 使用 Cron-Jobs 根据每天的特定时间段(即每晚午夜(执行我当前的 PHP 脚本。这意味着每次都从头开始重建它(实际上每晚都会构建一个新的站点地图(

好的,哪种策略更优化和有利可图?哪一个是标准方法?

修改 XML 文件有其危险。一个原因是您需要比较和编译操作(替换、插入、删除(。这很复杂,出错的可能性很高。另一个问题是站点地图可能很大,可能无法将它们加载到内存中进行修改。

我建议您在 cronjob 中生成 XML 站点地图。不要直接覆盖当前站点地图,而是在完成后复制/链接它。这样可以避免在这里出现错误时根本没有站点地图。

如果您希望在 SQL 表中以增量方式管理 URL,请将 XML 站点地图视为此表的导出。

这取决于您的网站是否繁忙。 如果您有一个小型网站,其中内容每周或每月都会发生变化,您只需通过脚本创建XML和HTML站点地图,只要有新内容可用,并将其上传到您的网站空间。

如果您有一个包含许多页面且几乎每天更新频率的网站,例如博客,那么您可以在新内容准备就绪时自动生成新的站点地图,这将非常方便。

如果您使用的是CMS,那么您有各种各样的插件可以增量更新它。或者你可以让你的脚本这样做。

我正在做类似的事情,起初我想把它分成数组并阅读每一行,看看 url 是否已经存在,如果是这样,请修改时间,如果不是,则创建一个新节点,但我在比较这些行时遇到了很多问题,所以我来这里寻求答案没有得到它,所以我回来测试并尝试了很多事情,直到答案来找我,所以这里是我是如何为其他寻找答案的人做的。每次通过帖子等创建新页面时调用该函数

<?php
function folderCreate($folderPaths){
$folder='';
$explodedFiles=explode('/',$folderPaths);
foreach($explodedFiles as $value){
$folder.=$value."/";
if(!file_exists($folder)){mkdir($folder);}
}
if(file_exists($folderPaths)){
return true;
}
}
function makeSitemap($fileLocation,$fileName='sitemap.xml'){
if(folderCreate($fileLocation)){
$sitemapXML='<?xml version="1.0" encoding="UTF-8"?>'. PHP_EOL;
$sitemapXML.='<urlset xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'. PHP_EOL;
$sitemapXML.='</urlset>'. PHP_EOL;
file_put_contents($fileLocation.$fileName,$sitemapXML);
return file($fileLocation.$fileName);
}
}
function numbering($int,$powOf=1){
$val=str_replace(".","",$int/pow(10,$powOf));
return $val;
}
function sitemapEdit2($url,$state="add",$fileLocation='',$sitemapName='sitemap.xml',$backup='backups/xml/sitemaps/'){
$date=getdate(date('U'));
if($fileLocation!="" && substr($fileLocation,-1)!="/")$fileLocation.="/";
$sitemapFile = file("$fileLocation$sitemapName") or $sitemapFile=makeSitemap($fileLocation,$sitemapName);
{//create a backup: Always create a back up DX
if($sitemapFile && folderCreate($backup)){
$fileArr=explode(".",$sitemapName);
copy("$fileLocation$sitemapName",$backup.$fileArr[0]."-backup-".substr(time(),5,-2).".".$fileArr[1]);
}
}
{//check if url exists
foreach($sitemapFile as $k=>$value) {
$value=trim($value);
if($value=="<loc>$url</loc>"){$firstLine=$k-1; $lastLine=$k+3;}
if($value=="</urlset>"){$urlEndLine=$k-1;} 
}
}
{//create conditions
$newFile='';
$lastMod="{$date['year']}-".numbering($date['mon'])."-".numbering($date['mday'])."T".numbering($date['hours']).":".numbering($date['minutes']).":00+00:00";
foreach($sitemapFile as $k=>$value) {
$newFile_tmp=$value;
if($state=="add"){
if($firstLine){//modify Lastmod
if($firstLine+2==$k)
$newFile_tmp=   "       <lastmod>$lastMod</lastmod>". PHP_EOL;
}else if($k==$urlEndLine){//add new url
$newFile_tmp.=  "   <url>". PHP_EOL;
$newFile_tmp.=  "       <loc>$url</loc>". PHP_EOL;
$newFile_tmp.=  "       <lastmod>$lastMod</lastmod>". PHP_EOL;
$newFile_tmp.=  "       <priority>0.80</priority>". PHP_EOL;
$newFile_tmp.=  "   </url>". PHP_EOL;
}
}else if($state=="remove" && $firstLine){
if($k>=$firstLine && $k<=$lastLine){
$newFile_tmp="";
}
}
$newFile.=$newFile_tmp;
}
}
return file_put_contents($fileLocation.$sitemapName,$newFile); 
}
{//tests
{//test 1 :try test 1 then comment out out test 1 and try test 2
if(sitemapEdit2("someurl3","add",'xml/test/','test_file.xml'))echo "file successfully updated <br>";
if(sitemapEdit2("someurl4","add",'xml/test/','test_file.xml'))echo "file successfully updated <br>";
}
{//test 2: comment out test 1 and try test 2
// if(sitemapEdit2("someurl3","remove",'xml/test/','test_file.xml'))echo "file successfully updated";
}
}
?>

最新更新