php生成sitemap.xml地图文件


前言

首先是要交个人网站的详情页都提交给百度、360、神马、谷歌等搜索引擎。
如果是简单的列表页,当然可以写好在放到服务器目录下。
比如博客类动态生成的就必须每天跑脚本去追加写入了。
本文采用的是laravel框架的command命令来跑脚本,大家可以适合自己项目的写法。

什么是Sitemap?

Sitemap(即站点地图)就是您网站上各网页的列表。创建并提交Sitemap有助于百度发现并了解您网站上的所有网页。您还可以使用Sitemap提供有关您网站的其他信息,如上次更新日期、Sitemap文件的更新频率等,供百度Spider参考。

百度对已提交的数据,不保证一定会抓取及索引所有网址。但是,我们会使用Sitemap中的数据来了解网站的结构等信息,这样可以帮助我们改进抓取策略,并在日后能更好地对网站进行抓取。

此外,Sitemap 与搜索排名没有关系。

sitemap文件遵循指南

  1. 文本文件每行都必须有一个网址。网址中不能有换行。不应包含网址列表以外的任何信息。
  2. 您必须书写完整的网址,包括 http。
  3. 每个文本文件最多可包含 50,000 个网址,并且应小于10MB(10,485,760字节)。如果网站所包含的网址超过 50,000个,则可将列表分割成多个文本文件,然后分别添加每个文件。
  4. 文本文件需使用 UTF-8 编码或GBK编码。

xml格式详解

<?xml version="1.0" encoding="utf-8"?>
<!-- XML文件需以utf-8编码-->
<urlset>
<!--必填标签-->
    <url>
        <!--必填标签,这是具体某一个链接的定义入口,每一条数据都要用<url>和</url>包含在里面,这是必须的 -->
        <loc>http://www.yoursite.com/yoursite.html</loc>
        <!--必填,URL链接地址,长度不得超过256字节-->
        <lastmod>2009-12-14</lastmod>
        <!--可以不提交该标签,用来指定该链接的最后更新时间-->
        <changefreq>daily</changefreq>
        <!--可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 -->
        <priority>0.8</priority>
        <!--可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间-->
    </url>
    <url>
        <loc>http://www.yoursite.com/yoursite2.html</loc>
        <lastmod>2010-05-01</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
    </url>
</urlset>

实战代码

sitemap组件代码

<?php
/**
 * 通用生成sitemap文件
 * User: WXiangQian
 */

namespace App\Http\Tools;

class CreateSiteMapXml
{
    private $fileDir;

    public function __construct($filePath)
    {
        $this->mkFolder($filePath);
        $filePath = rtrim($filePath, '/') . '/';
        $this->fileDir = $filePath;
    }

    /**
     * 生成sitemaps 入口
     * @param array $ary msps数组
     * @param string $parent maps父标签
     * @param string $type maps类型
     * @return bool
     */
    public function addSiteMap($ary, $parent, $type)
    {
        if (empty($ary)) {
            return false;
        }

        $file = $this->fileDir . $type . ".xml";//获取最后更新文件
        $content = $this->maps($ary, $parent);      //生成片段 maps
        $f = $this->readFile($file);

        if (empty($f)) {
            //获取新文件头部
            $f = $this->typeMain();
        } else {
            $f = file_get_contents($file);
        }

        $nf = $this->strInsert($f, strpos($f, strrchr($f, '</')), $content);
        $this->writeFile($file, $nf);
    }

    public function ary2maps($idAry, $loc, $cf, $pri)
    {
        $lastmod = date('Y-m-d');
        $ary = array();

        foreach ($idAry as $id) {
            $ary[] = array(
                'loc' => $loc . $id,
                'lastmod' => $lastmod,
                'changefreq' => $cf,
                'priority' => $pri,
            );
        }

        return $ary;
    }

    //读取文件
    public function readFile($file)
    {
        if (empty($file)) {
            return false;
        }
        $f = file_exists($file);
        return $f ?: '';
    }

    //写入文件
    public function writeFile($fileName, $content)
    {
        //echo $content;
        file_put_contents($fileName, $content); //更新其值
    }

    /**
     * 通用 maps
     * @param array $ary
     * @param string $parent
     * @return string
     *
     */
    public function maps($ary, $parent): string
    {
        $str = '';
        if (is_array($ary)) {
            foreach ($ary as $mval) {
                $str .= "<$parent>\r\n";
                foreach ($mval as $key => $val) {
                    $str .= "    <$key>$val</$key>\r\n";
                }
                $str .= "</$parent>\r\n";
            }
        }
        return $str;
    }

    /**
     * 指定位置前插入字符串
     * @param string $str 原字符串
     * @param int $i 位置
     * @param string $substr 插入的字符串
     * @return string
     */
    public function strInsert($str, $i, $substr): string
    {
        $lstr = substr($str, 0, $i);
        $rstr = substr($str, $i, strlen($str));
        $newstr = ($lstr . $substr . $rstr);
        return $newstr;
    }

    // sitemap type
    public function typeMain(): string
    {
        $xml = "<?xml version='1.0' encoding='UTF-8'?>\r\n<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9' \r\n" .
            "xmlns:mobile='http://www.sitemaps.org/schemas/sitemap-mobile/1'> \r\n" . "</urlset>";

        return $xml;
    }

    // 检查目标文件夹是否存在,如果不存在则自动创建该目录
    public function mkFolder($path)
    {
        if (!is_readable($path)) {
//            is_file($path) or mkdir($path, 0777);
            is_file($path) || mkdir($path, 0777) || is_dir($path);
        }
    }

}

调用sitemap组件

<?php

namespace App\Console\Commands;

use App\Http\Tools\CreateSiteMapXml;
use Illuminate\Console\Command;

class CreateSiteMapXmlCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'create_sitemap_xml';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '生成sitemap.xml文件';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $idAry = [
            117281450,
            110532521,
            105240627,
            105558534,
        ];
        $name = 'csdn';
        // 服务器目录地址
        $sitemaps = new CreateSiteMapXml('/Users/wxiangqian/my_project/laravel-api/sitemaps/');
        $videoAry = $sitemaps->ary2maps($idAry, 'https://wxiangqian.blog.csdn.net/article/details/', 'daily', '0.8');

        $sitemaps->addSiteMap($videoAry, 'url', $name);

    }
}

仓库地址

https://github.com/WXiangQian/laravel-api

实战截图

在这里插入图片描述

相关问题

Sitemap提交后,多久能被百度处理?

Sitemap数据提交后,一般在1小时内百度会开始处理。处理完成的时间视文件大小和您设置的抓取周期而定。

提交的Sitemap都会被百度抓取并收录吗?

百度对已提交的数据,不保证一定会抓取及收录所有网址。是否收录与页面质量相关。

XML格式的 Sitemap 中,“priority”提示会影响我的网页在搜索结果中的排名吗?

不会。Sitemap 中的“priority”提示只是说明该网址相对于您自己网站上其他网址的重要性,并不会影响网页在搜索结果中的排名。

网址在 Sitemap 中的位置是否会影响它的使用?

不会。网址在 Sitemap 中的位置并不会影响百度对它的识别或使用方式。

Sitemap中提交的url能否包含中文?

因为转码问题建议最好不要包含中文。

结束语

希望本文可以帮助大家解决php生成sitemap.xml地图文件问题。👍


文章作者: WXiangQian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WXiangQian !
 本篇
php生成sitemap.xml地图文件 php生成sitemap.xml地图文件
前言首先是要交个人网站的详情页都提交给百度、360、神马、谷歌等搜索引擎。 如果是简单的列表页,当然可以写好在放到服务器目录下。 比如博客类动态生成的就必须每天跑脚本去追加写入了。 本文采用的是laravel框架的command命令来跑脚本
2021-12-22
下一篇 
go run或build运行后,相对路径路径找不到:no such file or directory go run或build运行后,相对路径路径找不到:no such file or directory
遇到的问题go build完项目后,在使用绝对路径启动时,发现报错:open ./config/my.ini: no such file or directory 报错代码如下: conf, err := ini.Load(path + "
2021-08-30
  目录