ctf0/blazar

该软件包已被放弃,不再维护。未建议替代软件包。

动态预渲染页面

v2.0.1 2018-02-13 09:28 UTC

This package is auto-updated.

Last update: 2020-01-26 22:59:31 UTC


README

由于不切实际,该项目已被放弃,我强烈推荐尝试使用ServiceWorkers,以下是一篇入门文章:入门文章

Blazar

Latest Stable Version Total Downloads

通过利用在需要时在后台运行而不增加服务器或用户体验开销的 puppeteer,自动在动态中预渲染页面。


安装

  • 安装 puppeteer

  • composer require ctf0/blazar

  • (Laravel < 5.5) 将服务提供者添加到 config/app.php

'providers' => [
    ctf0\Blazar\BlazarServiceProvider::class,
]
  • 发布软件包资产

php artisan vendor:publish --provider="ctf0\Blazar\BlazarServiceProvider"

  • 将中间件添加到 app/Http/Kernel.php
protected $middlewareGroups = [
    // ...
    \ctf0\Blazar\Middleware\Blazar::class,
];

protected $routeMiddleware = [
    // ...
    'dont-pre-render' => \ctf0\Blazar\Middleware\DontPreRender::class,
];
  • 该软件包通过 Redis 缓存渲染结果,因此请确保检查文档以了解安装和配置。

配置

config/blazar.php

return [
    /*
     * puppeteer bin path
     */
    'puppeteer_path' => '',

    /*
     * puppeteer script path
     *
     * leave it empty to the use the one from the package
     */
    'script_path' => '',

    /*
     * prerender the page only if the url is being visited from a bot/crawler
     */
    'bots_only' => false,

    /*
     * log the url when its processed by puppeteer
     */
    'debug' => true,

    /**
     *  clear user cache on logout
     */
    'clear_user_cache' => true
];

使用

  • 我们使用 队列 在后台为多个原因预渲染访问的页面

    • 避免首次访问页面时的延迟。
    • 如果 puppeteer 需要很长时间来渲染页面或出现错误,不要让用户等待。
    • puppeteer 完成渲染后,页面将被缓存以进一步优化服务器负载。
    • 使您的网站 SEO 友好,因为现在我们提供的是 预渲染版本 的页面,而不是通常会对爬虫造成问题的普通页面。阅读更多
    • 即使对于流量较大的网站,我们仍将处理每个访问的页面而不会出现任何问题。

自动渲染页面

目前,为了 预渲染 任何页面,它必须首先被访问,但如果您想确保从第一天起一切正常,您可以使用 Spatie 的优秀软件包 laravel-link-checker

  • 只需运行 php artisan link-checker:run,您就会

    • 检查网站上哪些 "url/link" 无法工作。
    • 一次性 预渲染 所有页面。

清除缓存

  • 要清除整个软件包缓存,可以使用
php artisan blazar:flush

或从您的应用程序内部

Artisan::call('blazar:flush');

仅限爬虫

我们现在使用 CrawlerDetect 而不是依赖于 '?_escaped_fragment_'

如果你决定只为爬虫预渲染页面,则无需运行队列,因为页面将保持忙碌状态 "停滞响应",直到由 puppeteer 渲染,这将在实时发生。

然而,因为我们正在缓存结果,所以这将在每个页面只发生一次。

请注意,我们正在将页面缓存与 URL 一致,所以即使你关闭了 bots_only 选项,如果页面已缓存,我们总是会提供缓存的页面。


备注

队列

工作器只有在访问 URL 时才会触发,且如果此 URL 未缓存,但是如果你有一个未完成的老进程,队列将自动开始处理页面,因此要解决这个问题,只需重新启动队列服务器 beanstalkd, redis, etc...

# ex. using Homebrew

brew services restart beanstalkd

身份验证

我不知道如何让 Laravel 认为 puppeteer 访问的页面与当前登录用户相同。

因此尝试使用 auth 中间件 预渲染页面将像用户被重定向到主页或你在 Constollers/Auth/LoginController.phpMiddleware/RedirectIfAuthenticated.php 下的 redirectTo 中设置的任何内容一样被缓存。

为了解决这个问题,只需为这些路由添加 dont-pre-render 中间件,一切都将按预期工作。同时,确保将相同的中间件添加到任何需要为每个用户刷新 CSRF 令牌的路由 "登录,注册等...",以避免其他用户尝试使用这些页面时出现 CSRF Token Mismatch

更多信息