问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

php怎么生成sitemap.xml

发布网友 发布时间:2022-04-07 08:21

我来回答

3个回答

懂视网 时间:2022-04-07 12:42

之前用yaf和yii框架写过sitemap:思路是根据需求生成.xml文件保存到项目指定目录中。

用laravel换一个思路,生成.xml动态链接,而不是保存文件到目录

1.配置routes,生成xml访问链接

2.根据项目逻辑生成sitemap

上代码:

配置routes

 //sitemap
 Route::get('/sitemap/m/{type}.xml', 'SitemapController@siteMap');

核心代码

<?php
namespace AppHttpControllersM;
use AppHttpControllersBaseController;
use AppModelBbsArticle;
use AppModelBbsAsk;
use AppModelBbsThread;
use AppModelMainVideo;
use AppModelGarageSeriesInfoModel;
//todo 补充其他模块
use CarbonCarbon;
use IlluminateSupportFacadesCache;
class SitemapController extends BaseController
{
 //todo 写一个汇总文件
 public function siteMap($type)
 {
 $cacheKey = "site-" . $type;
 //2小时缓存 保证加载速度
 if (Cache::has($cacheKey)) {
  $siteMap = Cache::get($cacheKey);
 } else {
  $siteMap = $this->buildSiteMap($type);
  Cache::add($cacheKey, $siteMap, 120);
 }
 return response($siteMap)
  ->header('Content-type', 'text/xml');
 }
 /**
 * Build the Site Map
 */
 protected function buildSiteMap($type)
 {
 $sitemapInfo = [];
 switch ($type) {
  case 'video':
  $sitemapInfo = $this->getVideoInfo();
  break;
  case 'article':
  $sitemapInfo = $this->getArticleInfo();
  break;
  case 'bbs':
  $sitemapInfo = $this->getBbsInfo();
  break;
  case 'ask':
  $sitemapInfo = $this->getAskInfo();
  break;
  case 'series':
  $sitemapInfo = $this->getSeriesInfo();//车型库
  break;
 }
 $lastmod = $sitemapInfo[0]['pub_time'];
 $xml = [];
 $xml[] = '<?xml version="1.0" encoding="UTF-8"?' . '>';
 $xml[] = '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="http://www.baidu.com/schemas/sitemap-mobile/1/">';
 $xml[] = ' <url>';
 $xml[] = " <loc>https://m.xxx.com</loc>";
 $xml[] = " <lastmod>$lastmod</lastmod>";
 $xml[] = ' <changefreq>daily</changefreq>';
 $xml[] = ' <priority>0.8</priority>';
 $xml[] = ' </url>';
 foreach ($sitemapInfo as $sitemap) {
  $xml[] = ' <url>';
  $xml[] = " <loc>{$sitemap['url']}</loc>";
  $xml[] = " <mobile:mobile type="mobile"/>";
  $xml[] = " <lastmod>{$sitemap['pub_time']}</lastmod>";
  $xml[] = " </url>";
 }
 $xml[] = '</urlset>';
 return join("
", $xml);
 }
 /**
 * Return all the posts as $url => $date
 */
 protected function getVideoInfo()
 {
 $videos = Video::where('pub_time', '<=', Carbon::now())
  ->where('published', 2)
  ->where('is_del', 0)
  ->orderBy('id', 'desc')
  ->pluck('pub_time', 'id')
  ->all();
 $res = $article = [];
 foreach ($videos as $id => $pub_time) {
  $article['id'] = $id;
  $article['pub_time'] = substr($pub_time, 0, 10);
  $article['url'] = "https://m.xxx.com/video_" . $id . ".html";
  $res[] = $article;
 }
 return $res;
 }
 protected function getArticleInfo()
 {
 $articles = Article::where('pub_time', '<=', Carbon::now())
  ->where('published', 2)
  ->where('is_del', 0)
  ->orderBy('id', 'desc')
  ->pluck('pub_time', 'id')
  ->take(5000)
  ->all();
 $res = $article = [];
 foreach ($articles as $id => $pub_time) {
  $article['id'] = $id;
  $article['pub_time'] = substr($pub_time, 0, 10);
  $article['url'] = "https://m.xxx.com/news/article_" . $id . ".html";
  $res[] = $article;
 }
 return $res;
 }
 protected function getBbsInfo()
 {
 $articles = Thread::where('visible', 1)
  ->where('is_del', 0)
  ->orderBy('id', 'desc')
  ->pluck('dateline', 'id')
  ->take(10000)
  ->all();
 $res = $article = [];
 foreach ($articles as $id => $pub_time) {
  $article['id'] = $id;
  $article['pub_time'] = substr($pub_time, 0, 10);
  $article['url'] = "https://m.xxx.com/bbs/thread_" . $id . ".html";
  $res[] = $article;
 }
 return $res;
 }
 protected function getAskInfo()
 {
 $articles = Ask::where('state', 1)
  ->orderBy('id', 'desc')
  ->pluck('dateline', 'id')
  ->take(10000)
  ->all();
 $res = $article = [];
 foreach ($articles as $id => $pub_time) {
  $article['id'] = $id;
  $article['pub_time'] = substr($pub_time, 0, 10);
  $article['url'] = "https://m.xxx.com/ask_" . $id . ".html";
  $res[] = $article;
 }
 return $res;
 }
 //车型库
 protected function getSeriesInfo()
 {
 $articles = SeriesInfoModel::where('status', 1)
  ->where('is_stop', 0)
  ->pluck('name', 'id')
  ->all();
 $res = $article = [];
 foreach ($articles as $id => $pub_time) {
  $article['id'] = $id;
  $article['pub_time'] = date('Y-m-d', time());
  $article['url'] = "https://m.xxx.com/series/" . $id . "/details";
  $res[] = $article;
 }
 return $res;
 }
}

更多laravel框架相关技术文章,请访问laravel教程栏目!

热心网友 时间:2022-04-07 09:50

/**
 * 生成站点地图
 */
class sitemap{
    private $sitemapFile = array();
    private $oldxml      = null;
    private $newxml      = null;
    public $error        = null;
    public function __construct($sitemapFile) {
        $this->sitemapFile = $sitemapFile;
        if(is_file($this->sitemapFile)) {
            $data = file_get_contents($this->sitemapFile);
            if($data) {
                $this->oldxml = new SimpleXMLElement($data);
            }else{
                $this->error = '读取站点地图文件失败';
            }
        }else{
            $this->oldxml = $this->createEmptySitemap();
        }
        $this->newxml = $this->createEmptySitemap();
    }
    public function createEmptySitemap() {
        $str = '<?xml version="1.0" encoding="UTF-8"?>';
        $str .= '<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"> </urlset>';
        return new SimpleXMLElement($str);
    }
    public function addChilds($urlArr) {
        $urlArr = (array) $urlArr;
        foreach($urlArr as $url) {
            $priority = 0.5;
            $lastmod = date('Y-m-d');
            $changefreq = 'weekly';
            if(stripos($url,'.html')) {
                $priority = 1;
                $changefreq = 'monthly';
            }
            if($oldXmlUrl = $this->findOldXmlUrl($url)) {
                $priority = $oldXmlUrl->priority;
                $lastmod = $oldXmlUrl->lastmod;
                $changefreq = $oldXmlUrl->changefreq;
            }
            $rating = $this->newxml->addChild('url');
            $rating->addChild('loc',$url);
            $rating->addChild('priority',$priority);
            $rating->addChild('lastmod',$lastmod);
            $rating->addChild('changefreq',$changefreq);
        }
    }
    public function findOldXmlUrl($url) {
        $oldXmlUrl = '';
        foreach($this->oldxml->url as $key=>$xmlUrl) {
            if($xmlUrl->loc == $url) {
                $oldXmlUrl = $xmlUrl;
                unset($this->oldxml->url[$key]);
                break;
            }
        }
        return $oldXmlUrl;
    }
    public function save() {
        $data = $this->newxml->asXML();
        if(file_put_contents($this->sitemapFile,$data) === false) {
            $this->error = '写入站点地图数据失败';
            return false;
        }
        return true;
    }
}

上面这个是我个人博客生成站点地图用的类。

客户端调用代码如下:

$sitemapFile = 'Sitemap.xml';
$sitemap = new sitemap($sitemapFile);

if($sitemap->error) {
    die($sitemap->error);
}

$newUrl = [
    'http://www.kiscms.com/content/28.html'
];

$sitemap->addChilds();

if(!$sitemap->save()) {
    die($sitemap->error);
}

关键的问题是,你如何得到整站的url呢?

我个人博客的解决方法是写了个蜘蛛程序爬出来的。

热心网友 时间:2022-04-07 11:08

Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。

当php提交的时候,对应事件代码如下:

$xml="sitemap.xml";
$sitemap='<?xml version="1.0" encoding="UTF-8"?>
<urlset><url>
    <loc>这里是网址比如(3tii.com)</loc>
    <lastmod>'.date("Y-m-d",time()).'</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
</url>
</urlset>';
$fpxml=fopen($xml,"w+");
fwrite($fpxml,$sitemap);
fclose($fpxml);

sitemap.xml是你对应的文件,如果路径不同,前面可能需要加"../"之类的,priority
改为0.8好些。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
和面的和是什么读音? win10 应用打不开。全都打不开。 进入win10打不开软件 win10电脑软件都打不开是什么原因win10突然软件都打不开软件是怎么回事... 软件打不开怎么办win10电脑点不开软件最简单办法 请问下,离厦门市岛内的台湾路的国联大厦最近的建设银行和农业银行... 从巴黎都市到建设银行怎么坐公交车,最快需要多久 东莞万江官桥窖离建设银行哪路车最近? 建行七支分行有那些公交车经过 佛山哪里有飞越丛林拓展 做一个微信公众号多少钱?要有助力投票等功能的 现在公司想做个微信公众号啊,怎么做,多少钱?没公众号太不正规了。 盐水洗脸能美白祛斑吗拜托各位了 3Q 盐水洗脸能美白祛斑吗 电脑怎么下游戏 迅游VIP.帐号.密码 索尼克冲刺大冒险攻略 求2034游戏盒子高级会员账号和密码 大师 请问我的运势如何啊 侠义道2 的问题 4399豪华账号密码 冬天如何长高 他/她/它教育了我-满分佳作精评 快吧游戏账号忘记了,还记得密码怎么办? 梅子涵的《女儿的故事》摘抄 谁有快玩游戏账号密码 水浒传故事,易懂的,要比较长的 喵卷卷来了之蜡像城堡的千年诅咒出版了吗? 不能复制粘贴怎么办? 作文,急急急急啊!!求求各位了,我等下来取 如何投诉机关单位开会不戴口罩 不戴口罩怎么举报 酒吧里员工不戴口罩 能打疾控中心举报吗 宾馆工作人员不带口罩在哪举报 小区保安不戴口罩可以举报吗 九年级上册英语第四单元单词的读法 如果有人不戴口罩你会怎么劝说他? 英语单词人教版九年级上册1-----5单元单词解析!回答者加分重谢! 村子疫情检查站不带口罩可以举报吗? 九年级英语1~10单元重点单词和短语解析 疫情公司领导不让带口罩能不能告他? 求九年级英语第四单元单词表 上海出租车司机不戴口罩可以举报吗? 人教新目标版英语教材九年级第四单元重点难点考点句子,加翻译,越多越好 九年级英语四五单元单词,要图 求人教版九年级英语第四单元的单词,老师布置了抄写又忘带回家了......良辰必有重谢... 疫情期间不戴口罩违反什么法 疫情期间外出不戴口罩是否属于违法行为 求北京课改版英语第四单元十四课单词(九年级上) 不戴口罩依法处理