public function details(){

        $pid = I('get.goods_id');
$filename = "details_".$pid.".html";
if(file_exists($filename)){
echo file_get_contents($filename);
}else{
ob_start();
require("/store/Store/Home/View/category/details_model.html");
$str = ob_get_contents();
ob_end_clean();
$data['goods_id']= I('get.goods_id');
$goods = M('goods');
$res = $goods->where($data)->find();
$str = str_replace('{$goods_data.goods_name}',$res['goods_name'],$str);
$str = str_replace('{$goods_data.market_price}',$res['market_price'],$str);
$str = str_replace('{$goods_data.goods_price}',$res['goods_price'],$str);
$str = str_replace('{$goods_data.goods_number}',$res['goods_number'],$str);
$str = str_replace('{$goods_data.goods_desc}',$res['goods_desc'],$str);
$str = str_replace('{$goods_data.goods_img}',$res['goods_img'],$str);
$str = str_replace('{$goods_data.goods_id}',$res['goods_id'],$str); file_put_contents($filename,$str);
echo $str;
}

创建一个模板文件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="../../../Public/home/res/static/css/main.css">
<link rel="stylesheet" type="text/css" href="../../../Public/home/res/layui/css/layui.css">
<script type="text/javascript" src="../../../Public/home/res/layui/layui.js"></script>
<script type="text/javascript" src="../../../Public/Jquery2.1.4.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
</head>
<body> <div class="site-nav-bg">
<div class="site-nav w1200">
<p class="sn-back-home">
<i class="layui-icon layui-icon-home"></i>
<a href="#">首页</a>
</p>
<div class="sn-quick-menu">
<div class="login"><a href="/home/login/index">登录</a></div>
<div class="sp-cart"><a href="/home/cart/index">购物车</a><span>2</span></div>
</div>
</div>
</div> <div class="header">
<div class="headerLayout w1200">
<div class="headerCon">
<h1 class="mallLogo">
<a href="#" title="母婴商城">
<img src="../../../Public/home/res/static/img/logo.png">
</a>
</h1>
<div class="mallSearch">
<form action="" class="layui-form" novalidate>
<input type="text" name="title" required lay-verify="required" autocomplete="off" class="layui-input" placeholder="请输入需要的商品">
<button class="layui-btn" lay-submit lay-filter="formDemo">
<i class="layui-icon layui-icon-search"></i>
</button>
<input type="hidden" name="" value="">
</form>
</div>
</div>
</div>
</div> <div class="content content-nav-base datails-content">
<div class="main-nav">
<div class="inner-cont0">
<div class="inner-cont1 w1200">
<div class="inner-cont2">
<a href="/home/category/index">所有商品</a>
<a href="home/groupon/index" class="active">今日团购</a>
<a href="__PUBLIC__/home/html/information.html">母婴资讯</a>
<a href="home/aboutus/index">关于我们</a>
</div>
</div>
</div>
</div>
<div class="data-cont-wrap w1200">
<div class="crumb">
<a href="javascript:;">首页</a>
<span>></span>
<a href="javascript:;">所有商品</a>
<span>></span>
<a href="javascript:;">产品详情</a>
</div>
<div class="product-intro layui-clear">
<div class="preview-wrap">
<a href="javascript:;"><img src="../../..{$goods_data.goods_img}" width="400px" height="400px"></a>
</div>
<div class="itemInfo-wrap">
<div class="itemInfo">
<div class="title">
<h4>{$goods_data.goods_name}</h4>
<span><i class="layui-icon layui-icon-rate-solid"></i>收藏</span>
</div>
<div class="summary">
<p class="reference"><span>参考价</span> <del>¥{$goods_data.market_price}</del></p>
<p class="activity"><span>活动价</span><strong class="price"><i>¥</i>{$goods_data.goods_price}</strong></p>
<p class="address-box"><span>送&nbsp;&nbsp;&nbsp;&nbsp;至</span><strong class="address">江西&nbsp;&nbsp;南昌&nbsp;&nbsp;东湖区</strong></p>
<p class="reference"><span>库存量</span> <span id="t_number">{$goods_data.goods_number}</span></p>
</div>
<div class="choose-attrs">
<div class="color layui-clear"><span class="title">颜&nbsp;&nbsp;&nbsp;&nbsp;色</span> <div class="color-cont"><span class="btn">白色</span> <span class="btn active">粉丝</span></div></div>
<div class="number layui-clear"><span class="title">数&nbsp;&nbsp;&nbsp;&nbsp;量</span><div class="number-cont"><span class="cut btn" onclick="down_num()">-</span><input id="number" onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" onafterpaste="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" maxlength="4" type="" name="" value="1"><span class="add btn" onclick="add_num()">+</span></div></div>
</div>
<div class="choose-btns">
<button class="layui-btn layui-btn-primary purchase-btn">立刻购买</button>
<button class="layui-btn layui-btn-danger car-btn" id="add_car"><i class="layui-icon layui-icon-cart-simple"></i>加入购物车</button>
</div>
</div>
</div>
</div>
<div class="layui-clear">
<div class="aside">
<h4>热销推荐</h4>
<div class="item-list">
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
<div class="item">
<img src="../../../Public/home/res/static/img/details_img2.jpg">
<p><span>可爱宝宝粉色连体秋裤</span><span class="pric">¥99.00</span></p>
</div>
</div>
</div>
<div class="detail">
<h4>详情</h4>
<div class="item">
{$goods_data.goods_desc}
<img src="../../../Public/home/res/static/img/footer.png">
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
/*
layui.config({
base: '__PUBLIC__/home/res/static/js/util/' //你存放新模块的目录,注意,不是layui的模块目录
}).use(['mm','jquery'],function(){
var mm = layui.mm,$ = layui.$;
var cur = $('.number-cont input').val();
$('.number-cont .btn').on('click',function(){
if($(this).hasClass('add')){
cur++; }else{
if(cur > 1){
cur--;
}
}
$('.number-cont input').val(cur)
}) });*/
</script> <script>
function add_num(){
var number =$("#number").val();
var t_number = $("#t_number").html();
var new_num = parseInt(number)+1;
if(new_num>t_number){
layer.alert("选择数量不能大于库存量");
return false;
}else{
$("#number").val(new_num);
}
} function down_num(){
var number =$("#number").val();
var new_num = parseInt(number)-1;
if(new_num<1){
layer.alert("至少选择一件");
return false;
}else{
$("#number").val(new_num);
}
} </script> <script>
$("#add_car").click(function(){
var goods_id ="{$goods_data.goods_id}";
//alert(goods_id);return false;
var name ="{$goods_data.goods_name}";
var number =$("#number").val();
var t_number = "{$goods_data.goods_number}";
var price = "{$goods_data.goods_price}";
var img = "{$goods_data.goods_img}";
$.ajax({
url:'add_car',
type:'post',
data:{
'goods_id':goods_id,
'name':name,
'number':number,
'price':price,
'img':img
},
dataType:'json',
success:function (e) {
if(e.status==1){
layer.alert(e.info);
window.location.href="/home/cart/index";
}else{
layer.alert(e.info);
}
}
})
}); </script>
<script>
layui.use('layer', function(){
var layer = layui.layer;
});
</script>

静态化

静态化: 1.纯(真)静态 2.伪静态

静态化是解决减轻网站压力,提高网站访问速度的常用方案.包括:纯静态和伪静态。

纯静态:
将PHP程序生成静态的HTML文件,保存到服务器的磁盘中。
优势:
减少PHP程序编译和对数据库的查询。

原理:
在用户访问PHP程序时,首先检测静态的HTML文件是否存在,如果存在直接输出静态文件,如果静态文件不存在,查询数据库,生成静态文件

缓冲

1.缓冲,也就是buffer, ob是output_buffering的简写

2.echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

从echo、print_r函数到发送信息给客户端经历了两个缓冲区,在客户端还经历了一个浏览器缓冲区。
也就是说,当你echo输出数据的时候,其实是要经历一层缓存的,只是说这个 buffer默认是关闭的,当我们开启之后,输出数据时,就会先走缓冲区了,当缓冲区数据满了之后就自动输出。

3.. 在程序中如果开启ob_start(),所有的echo输出都会保存到ob缓存中,可以使用ob系列函数进行操作,如果没有,默认情况下,在程序执行结束,会把缓存中的数据发送给浏览器

ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器

4.
ob的基本作用:
1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。
2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。

ob_start()
:打开输出控制缓冲
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE.

ob_get_contents()
:返回输出缓冲区的内容
返回值:输出缓冲区的内容,或者如果输出缓冲区无效将返回FALSE

ob_clean()
:清空(擦掉)输出缓冲区的内容。 没有返回值

ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE

ob_flush()
:冲刷出(送出)输出缓冲区中的内容。 没有返回值

ob_end_flush :发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区。
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE

2019-09-17 thinkphp网页静态化的更多相关文章

  1. 网页静态化技术--Freemarker入门

    网页静态化技术:为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说,至少几百万个商品,每个商品又 ...

  2. thinkphp 页面静态化

    页面静态化(代码在最后) 静态页面 是网页的代码都在页面中,不需要执行asp,php,jsp,.net等程序生成客户端网页代码的网页,静态页面网址中一般不含“?”.“=”.“&”等特殊符号.  ...

  3. 【转】使用Freemarker实现网页静态化

    使用Freemarker实现网页静态化 2017年08月20日 20:45:51 阅读数:1981 1.1. 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基于 ...

  4. 网页静态化—redis | freemarker

    1.   学习计划 1.商品详情页面展示,动态展示 jsp + redis 2.使用freemarker实现网页静态化 3.ActiveMq同步生成静态网页 两个方案对比,方案一依赖web容器,red ...

  5. FreeMarker实现网页静态化

    1.FreeMarker实现网页静态化. FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servl ...

  6. 网页静态化技术Freemarker的详细介绍

    网页静态化技术Freemarker 一.Freemarker的基本介绍 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道 ...

  7. 网页静态化解决方案-Freemarker demo+语法

    1.网页静态化技术Freemarker 1.1为什么要使用网页静态化技术 网页静态化解决方案在实际开发中运用比较多,例如新闻网站,门户网站中的新闻频道或者是文章类的频道. 对于电商网站的商品详细页来说 ...

  8. TP框架做网页静态化

    首先放上一张某手册中的一段代码: 我们要想在TP框架中执行网页静态化,在这段代码的基础上稍加添加就可以了: 在TP5框架中,为了方便寻找模板文件与生成的静态文件,我们将模板文件以及生成的静态文件放在p ...

  9. JAVAEE——宜立方商城10:使用freemarker实现网页静态化、ActiveMq同步生成静态网页、Sso单点登录系统分析

    1. 学习计划 1.使用freemarker实现网页静态化 2.ActiveMq同步生成静态网页 2. 网页静态化 可以使用Freemarker实现网页静态化. 2.1. 什么是freemarker ...

随机推荐

  1. 【餐厅】 What kind of food would you like to eat tonight?

    核心句型 What kind of food would you like to eat tonight? 你今晚想吃哪种菜? What would you like to eat ? 你想吃什么? ...

  2. 基本 Python 面试问题

    目录 1.为什么学习Python? 2.通过什么途径学习的Python? 3.Python和Java.PHP.C.C#.C++等其他语言的对比? 4.简述解释型和编译型编程语言? 5.Python解释 ...

  3. mybatis-config.xml 知识点

    typeAliases 标签:配置别名,主要用于 XML 文件中的 resultType 参数. mappers 标签:配置所有的 mapper. MyBatis 和 Spring Boot 配合使用 ...

  4. 【JavaWeb】SpringBoot架构

    0.文件夹结构 1.接口统一返回值 2.全局异常处理 3.数据库访问配置[OK] 4.前端模版页[OK] 5.Swagger接口[OK] 6.公共插件[OK] ---lombok ---google ...

  5. maven下载与配置(三)

    一.下载 在官网下载 https://maven.apache.org/download.cgi 我这里现在的是apache-maven-3.2.5 . 二.配置环境变量 右键我的电脑-属性-高级系统 ...

  6. 生鲜超市项目错误及解决办法(crispy_forms、外键指向自己、class嵌套访问父类、meta类及各种字段参数)

    为什么要在INSTALLED_APPS中加入crispy_forms? 因为django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 为什么有 ...

  7. 史上最全NOIP初赛知识点

    CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...

  8. USACO Telephone Lines

    洛谷 P1948 [USACO08JAN]电话线Telephone Lines https://www.luogu.org/problem/P1948 JDOJ 2556: USACO 2008 Ja ...

  9. ISerializable接口

    继承ISerializable接口可以灵活控制序列化过程 格式化器的工作流程:格式化器再序列化一个对象的时候,发现对象继承了ISerializable接口,那它就会忽略掉类型所有的序列化特性,转而调用 ...

  10. [LeetCode] 898. Bitwise ORs of Subarrays 子数组按位或操作

    We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...