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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

没看明白,什么实现的静态化

3年前 评论
Wangds (楼主) 3年前
adays

先看个眼熟,收藏起来了。

3年前 评论
Wangds (楼主) 3年前
aa24615

发表一下我写的静态化哈
我是写了一个指令
然后用任务调度 设置好重新生成的时间

//生成首页
$html = file_get_contents('http://www.demo.com/index.php');
file_put_contents(public_path().'/index.html',$html);

//生成列表页
$list = Types::get();
foreach ($list as $val){
  $html = file_get_contents('http://www.demo.com/index.php/'.$val->file.'.html');
  file_put_contents(public_path().'/'.$val->file.'.html',$html);
}

//生成文章页
$list = Articles::get();
foreach ($list as $val){
  $html = file_get_contents('http://www.demo.com/index.php/article/'.$val->file.'.html');
  file_put_contents(public_path().'/article/'.$val->id.'.html',$html);
}

echo "ok";
echo PHP_EOL;

nginx 默认文件 设为index.html 优先与index.php
当html没有生成的时候访问的就是路由
当html已生成的情况下访问的就是静态html
优点: 第一次打开的时候不需要去生成,对前台用户没有影响
缺点: 会生成大量的文件,有些页面可能访问不频繁也会生成,另外路由多的情况要写很多规则

其他登录状态,跟楼主方法一样,另外我的路由后缀就是.html的哈

任务调度

//每10分钟生成一次html
$schedule->command('command:set_html')->cron("*/10 * * * *");
//不同的页面过期时间不一样,可以多写指定指令就搞定啦
3年前 评论
Wangds (楼主) 3年前

静态化挺难的,一直没想好怎么处理。
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,直接后台页面上点击更新某条即可?)

水平有限,这几个点还在想,所以如果有好的例子,虚心学习!

3年前 评论
Wangds (楼主) 3年前

学习一下

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!