当前位置 > it书童 > laravel > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

laravel 定时生成站点地图 sitemap

laravel it书童 2019-10-12 10:23:55 0赞 0踩 2092阅读 0评论

sitemap 站点地图有利于搜索引擎更好地抓取网站链接,虽然 laravel 有现成的扩展包,如 Laravelium/Sitemap,但觉得使用太复杂,而且老外写的是针对 google 的。对于小站点,url 并不多,还是自己手动撸一个更加方便

生成站点地图

$ php artisan make:command map

参考以下代码,结合自己网站程序进行修改

<?php

namespace App\Console\Commands;

use App\Models\Article;
use App\Models\Category;
use Illuminate\Console\Command;

class map extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'generate:sitemap';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '生成站点地图';

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

    /**
     * Execute the console command.
     */
    public function handle()
    {
        // 首页
        $data[] = ['loc' => route('index'), 'priority' => 1];
        // 分类页
        Category::query()
            ->orderBy('id', 'ASC')
            ->pluck('id')
            ->map(function($item) use(&$data) {
                $data[] = ['loc' => route('category', ['id' => $item]), 'priority' => 0.8];
            });
        // 详情页
        Article::query()
            ->orderBy('id', 'ASC')
            ->pluck('id')
            ->map(function($item) use(&$data) {
                $data[] = ['loc' => route('detail', ['id' => $item]), 'priority' => 0.6];
            });
        $sitemap = '<?xml version="1.0" encoding="utf-8"?>' . "\n";
        $sitemap .= '<urlset>' . "\n";
        $lastmod = date('Y-m-d', time());
        $changefreq = 'daily';
        foreach ($data as $k => $v) {
            if ($v) {
                $sitemap .= "<url>\n";
                $sitemap .= "<loc>{$v['loc']}</loc>\n";
                $sitemap .= "<lastmod>$lastmod</lastmod>\n";
                $sitemap .= "<priority>{$v['priority']}</priority>\n";
                $sitemap .= "<changefreq>$changefreq</changefreq>\n";
                $sitemap .= "</url>\n";
            }
        }
        $sitemap .= "</urlset>";
        file_put_contents(public_path() . '/sitemap.xml', $sitemap);
    }

}

测试生成站点地图

$ php artisan generate:sitemap

访问:https://www.itshutong.com/sitemap.xml

加入计划任务

设置每天凌晨三点执行站点地图

app/Console/Kernel.php 中添加:

$schedule->command('generate:sitemap')->dailyAt('03:00');

确保 crontab 开启了 laravel 定时任务的守护进程:

* * * * * php /www/web/artisan schedule:run >> /dev/null 2>&1
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/344/laravel-generates-sitemap-regularly