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 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 3

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

2天前 评论
Wangds (楼主) 2天前

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

1天前 评论
Wangds (楼主) 1天前
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 * * * *");
//不同的页面过期时间不一样,可以多写指定指令就搞定啦
1天前 评论
Wangds (楼主) 1天前

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