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. 浏览器地址栏输入url回车之后发生了些什么

    1.输入地址 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全ur ...

  2. 201871010101- 陈来弟《面向对象程序设计(java)》第6-7周学习总结

    201871010101- 陈来弟<面向对象程序设计(java)>第6-7周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh ...

  3. 13-numpy笔记-莫烦pandas-1

    代码 import pandas as pd import numpy as np s = pd.Series([1,3,6,np.nan, 44,1]) print('-1-') print(s) ...

  4. NeuHub图像垃圾分类api和百度图像识别api

    京东 NeuHub图像垃圾分类申请:http://neuhub.jd.com/gwtest/init/242 文档:https://aidoc.jd.com/image/garbageClassifi ...

  5. HTTP协议COOKIE和SESSION有什么区别

    1.为什么会有COOKIE这种机制 首先一种场景, 在一个网站上面, 我发起一次请求,那服务器怎么知道我是谁?是谁发起的这次请求呢,  HTTP协议是无状态的协议, 浏览器的每一次请求,服务器都当做一 ...

  6. 详解 ASP.NET Core MVC 的设计模式

    MVC 是什么?它是如何工作的?我们来解剖它 在本节课中我们要讨论的内容: 什么是 MVC? 它是如何工作的? 什么是 MVC MVC 由三个基本部分组成 - 模型(Model),视图(View)和控 ...

  7. Bootstrap-table实现动态合并相同行

    Bootstrap-table  表格合并相同名字的列 @编写function() /** * 合并行 * @param data 原始数据(在服务端完成排序) * @param fieldName ...

  8. Unity Shader 序列帧动画

    shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...

  9. linux 内核参数tcp_max_syn_backlog对应的队列最小长度

    环境:centos7.4 内核版本3.10 内核参数net.ipv4.tcp_max_syn_backlog定义了处于SYN_RECV的TCP最大连接数,当处于SYN_RECV状态的TCP连接数超过t ...

  10. Laravel自定义排序

    如果数据库的status字段有0,1,2,3几种状态,如果想让status为1,2的状态排在最前面 那么可以这样: $obj = $obj->orderByRaw(DB::raw('FIELD( ...