ctf0 / blazar
动态预渲染页面
Requires
- php: ~7.0
- ctf0/package-changelog: ^1.0
- illuminate/support: ~5.4.0|~5.5.0|~5.6.0
- jaybizzle/laravel-crawler-detect: ^1.0
README
由于不切实际,该项目已被放弃,我强烈推荐尝试使用ServiceWorkers,以下是一篇入门文章:入门文章。
Blazar
通过利用在需要时在后台运行而不增加服务器或用户体验开销的 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.php
和 Middleware/RedirectIfAuthenticated.php
下的 redirectTo 中设置的任何内容一样被缓存。
为了解决这个问题,只需为这些路由添加 dont-pre-render
中间件,一切都将按预期工作。同时,确保将相同的中间件添加到任何需要为每个用户刷新 CSRF 令牌的路由 "登录,注册等...",以避免其他用户尝试使用这些页面时出现 CSRF Token Mismatch
。