sgtaziz/blazar

动态预渲染页面

v1.0.8 2018-01-14 18:02 UTC

This package is auto-updated.

Last update: 2024-09-17 05:51:16 UTC


README

Latest Stable Version Total Downloads

通过利用 PhantomJs 自动化预渲染页面,它在需要时在后台运行,不会给服务器或用户体验带来任何开销。


安装

  • 安装 PhantomJs

  • 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 [
    /*
     * phantomjs bin path
     */
    'phantom_path' => '',

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

    /*
     * phantomjs options
     */
    'options' => '--ignore-ssl-errors=true --ssl-protocol=any --disk-cache=false --debug=true 2>&1',

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

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

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

使用方法

  • 我们使用 队列 在后台预先渲染访问的页面,原因有很多

    • 避免首次访问页面时延迟。
    • PhantomJs 渲染页面或出现问题时,不要让用户等待。
    • PhantomJs 完成渲染后,页面将缓存起来以进一步优化服务器负载。
    • 使您的网站 SEO 优化,因为我们现在提供的是预先渲染的版本,而不是通常会对爬虫产生问题的普通页面。 阅读更多
    • 即使是流量较大的网站,我们也会处理每个访问的页面,不会出现问题。

# 自动渲染页面

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

  • 只需运行 php artisan link-checker:run,你将

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

# 清除缓存

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

或从您的应用内部

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

# 仅针对爬虫

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

如果您决定只为爬虫预先渲染页面,不需要运行队列,因为页面将保持忙碌的 "停滞响应" 状态,直到 PhantomJs 动态渲染,这将在后台发生。

然而,由于我们正在缓存结果,因此每个页面只会发生一次。

请注意,我们正在保存与 URL 相等的页面缓存,即使您关闭了 bots_only 选项,如果页面已缓存,我们也将始终提供缓存的版本。


备注

# 为什么选择 PhantomJs

我尝试了 ususpuppeteer

我的唯一看法是,两者都需要运行一个 Chrome 实例,而我希望将整个事情尽可能隐藏和保持低级。

然而,如果有人知道如何让"any"像"PhantomJs"一样工作,我非常愿意倾听 👂。

## 队列

当访问一个URL时,工作者应该被触发,并且如果这个URL未被缓存,然而如果你有一个未完成的老进程,队列将自行开始处理页面,为了解决这个问题,只需重新启动队列服务器 beanstalkd, redis, 等...

# ex. using Homebrew

brew services restart beanstalkd

## 认证

因为我不知道如何让laravel认为通过phantomjs访问的页面与当前登录用户相同。

所以尝试使用 auth 中间件 预渲染页面将被缓存,就像用户被重定向到主页或者你设置在 Controllers/Auth/LoginController.phpMiddleware/RedirectIfAuthenticated.php 下的 redirectTo 一样。

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

## 更多阅读