sgtaziz / blazar
Requires
- php: ~7.0
- ctf0/package-changelog: ^1.0
- illuminate/support: ^5.4 || ^5.5
- jaybizzle/laravel-crawler-detect: ^1.0
README
通过利用 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
我的唯一看法是,两者都需要运行一个 Chrome 实例,而我希望将整个事情尽可能隐藏和保持低级。
然而,如果有人知道如何让"any"像"PhantomJs"一样工作,我非常愿意倾听 👂。
## 队列
当访问一个URL时,工作者应该被触发,并且如果这个URL未被缓存,然而如果你有一个未完成的老进程,队列将自行开始处理页面,为了解决这个问题,只需重新启动队列服务器 beanstalkd, redis, 等...
# ex. using Homebrew
brew services restart beanstalkd
## 认证
因为我不知道如何让laravel认为通过phantomjs访问的页面与当前登录用户相同。
所以尝试使用 auth 中间件 预渲染页面将被缓存,就像用户被重定向到主页或者你设置在 Controllers/Auth/LoginController.php 和 Middleware/RedirectIfAuthenticated.php 下的 redirectTo 一样。
为了解决这个问题,只需将这些路由添加 dont-pre-render 中间件,一切都将按预期工作。还要确保将相同的中间件添加到任何需要为每个用户刷新csrf-token的路由,例如 "登录,注册,等等",以避免其他用户尝试使用这些页面时出现 CSRF Token Mismatch。