Laravel页面静态化最佳实践
环境
php7.4
nginx1.17
mysql5.7
laravel8
windows10
路线
控制器返回视图时这么操作
public function test(Request $request) { $view = view('test'); Storage::disk('local')->put('views/' . $request->path(), $view->render()); return $view; }nginx配置这么写
location / { root D:/wwwroot/demo/storage/app/views; index index.html; try_files $uri $uri.html @default; } location @default { root D:/wwwroot/demo/public; index index.php; try_files $uri $uri/ /index.php$is_args$query_string; }
这样就能在第一次访问时生成相应的静态网页,之后再访问时就会直接返回静态网页。
- 进一步
实现过期删除、自动更新功能,大概就是获取views文件夹下的所有文件名,记录在案,然后定期清除,还可以主动发出请求触发更新。另一个就是无损实现全站静态化,这需要覆盖 Foundations/helpers.php 中的 view() 方法,然而这个文件已经被创建自动加载映射了,正常情况下无法覆盖,你可以安装 funkjedi/composer-include-files ,它可以优先自动加载你自定义的php文件,这样就ok了。
- 认证状态
通常需要显示当前登录用户的头像,静态化后就不能显示了?当然可以。
比如,认证后保存用户数据到浏览器,通过js把当前状态更新到静态的html上。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
没看明白,什么实现的静态化
先看个眼熟,收藏起来了。
发表一下我写的静态化哈
我是写了一个指令
然后用任务调度 设置好重新生成的时间
nginx 默认文件 设为index.html 优先与index.php
当html没有生成的时候访问的就是路由
当html已生成的情况下访问的就是静态html
优点: 第一次打开的时候不需要去生成,对前台用户没有影响
缺点: 会生成大量的文件,有些页面可能访问不频繁也会生成,另外路由多的情况要写很多规则
其他登录状态,跟楼主方法一样,另外我的路由后缀就是.html的哈
任务调度
静态化挺难的,一直没想好怎么处理。
1,分页url用什么格式? category/article?page=1 转为 category/article-1.html 吗?对应分页html标签也要对应改。
2,文章内容里的引用如何替换?文章内容里面引用了别的页面,又该如何正则替换呢?比如引用 /php/intro 转为 php/intro.html 吗? 得有个全局规则和正则替换工具。
3,刷新谁来做?某个列表页里有个div是显示最新10篇文章(非ajax获取),设置过期时间10分钟的话,是由第10分钟的倒霉用户来刷新,还是linux定时任务来访问刷新?
4,生成失败通知:定时任务如生成失败的话,可能还得发微信消息通知管理员手工解决(倒霉用户刷新同样)
5,静态文件紧急处置:某几个分类列表默认20分钟刷新一次,现在有个突发情况,需要立刻刷新,得有机制能手工刷新(立刻手工命令行执行crontab?看有没有单独的计划任务,如果是一个大任务,读分类表,循环处理生成,那立刻执行等于全部刷新一次。 除了这种方法,还是设计个缓存curd,直接后台页面上点击更新某条即可?)
水平有限,这几个点还在想,所以如果有好的例子,虚心学习!
学习一下