页面静态化
页面静态化
u 大型网站的核心技术有哪些(带宽 / 数据库 )
连接池
1. 页面静态化 ( 核心 把动态的页面 转成 静态页面 从而减少对数据库操作的次数 )
2. 缓存技术(内存角度存储->memcached)
3. 服务器集群(a. 硬件 b. 软件架构)
简单介绍 -> 示意图:
4. 数据库优化(a. 表结构(符号3NF) b. 添加适当索引 (1.1主键索引 1.2 普通索引 1.3 唯一索引 1.4 全文索引 sphinx ) c. 读写分离 d. 分表(垂直分割 / 水平分割 ) )
u 页面静态化技术
u 几个重要的概念
1. 静态网址
举例: http://localhost/test.html
当我们的页面是 静态页面时, 则,我们放的url 就是一个静态网址.
好处是 a. 利用seo (search engine optimization ) 搜索引擎优化. b. 防止sql注入攻击
c. 不操作数据库,所以效率高
2. 动态网址
举例 : http://localhost/test.php?age=80
特点是: 一般说可以接受用户的数据,
http://localhost/news.php?lang=cn&class=1&id=2
动态网址,不利用SEO ,因为搜索引擎认为,动态网页的内容一般说都会和数据库相关,所以 搜索引擎就会放弃抓取.
3. 伪静态网址
我们公司开发是,为了SEO,同时为了防止 注入攻击,往往会把 动态网站 改写成 静态网址 , 这样的网址,我们称为伪静态
http://localhost/news.php?lang=cn&class=1&id=2
希望
http://localhost/news-cn-sport-id2.html (这个网址就是伪静态),但是请大家注意,伪静态网站不是真正的静态页面,所以,只是形式上的,访问它,仍然会访问数据库
=>伪静态技术
u 页面静态化的分类
1. 从形式上分为 真静态和伪静态
2. 从范围看: 整体静态化,和局部静态
介绍一款工具 apache自带的 ab.exe 程序,该程序可以用于测试 你的页面的效率怎样. 同时可以测试你的apache的负载能力有多大! , 该程序在控制台下使用
使用的语法:
ab.exe –n 请求的次数 -c 并发次数 访问的页面的url地址
说明 并发次数 在同一个时间点,发出的请求次数
举例说明:
写一个 test1.php 页面
ab.exe –n 10000 –c 100 http://localhost/test1.php
注意如何看统计信息:
后面我们给了一个大致的结论:
① 网站能支撑的在线人数大致是支撑 并发人数的 10左右
② html和PHP访问的效率表
u 怎样的Html文件,会符号 SEO 的喜好
1. url 不要超过 255
2. 静态页面不要带参数 ,造成重复抓取
3. meta 数据尽量完善
<meta name=”keywords” content=”关键字 ”/>
<meta name=”description” content=”页面的简单介绍”/>
4. <img src=”小明.png” alt=”小明”/>
5. 页面不在建议使用 框架 frame/frameset/iframe 不建议在前端页面使用
u 页面静态化有两种 1. 真静态 2. 伪静态
真静态有两个方法
1. 使用PHP 的 ob缓存机制来实现 页面静态化
2. 使用模板技术来实现页面静态化
u OB缓存是什么?怎么用?
1. 快速入门
注意: 在PHP5.3 这个版本,ob默认是打开的.
PHP5.2 这会报告waring
我们可以通过 php.ini 中可以配置是否启用 ob
初步的认识:
☞ 我们可以认为,在apache的服务器端,有两个缓存 ob缓存(这个程序员可以控制)
,程序缓存是必须有的.
当有一段代码 <?php echo “abc” ; ?> 如果有 echo ,当你启用 ob缓存,那么这些echo 优化放在ob缓存中, 如果没有ob缓存,则直接放入了程序缓存.
如果你只有程序缓存,需要大家清楚,header 语句前,不能有 echo 语句,否则有提示
headers already sent by
截图:
ob的相关函数.
说明的代码:
ob3.php
<?php
//这里我们可以再找个页面把ob缓存打开
//开启ob缓存
ob_start();
echo "hello,wrold!";
header("content-type: text/html;charset=utf-8");
echo "你好!";
//把ob内容缓存清空,但是ob缓存还在
//ob_clean();
//把ob内容缓存清空,同时关闭ob缓存
//ob_end_clean();
//把ob缓存的内容,刷新到程序缓存,同时关闭ob缓存
//ob_end_flush();
//把ob缓存的内容,刷新到程序缓存,不关闭ob缓存
ob_flush();
echo "笑傲江湖";
//获取ob缓存内容
$con=ob_get_contents();
//需要把日志,写入文件. echo print_r var_dump ,写文件 ,下断点.
file_put_contents("d://hsp.log",$con);
现在我们再说最后一个函数 flush()
该函数是把 程序缓存的内容,强制刷新到 浏览器
ob4.php
这里有一个知识点:
当我们请求一个PHP页面时,该页面会发出几次请求,和各部分的代码在哪里执行示意图:
u 使用ob缓存实现页面静态化
现在开始以一个新闻管理系统,来学习我们的页面静态化.
1. 先创建数据库和表
create table news(
id int unsigned primary key auto_increment, /*新闻编号*/
title varchar(128) not null, /*新闻的标题*/
content varchar(256) not null, /*新闻的内容*/
filename varchar(32)) engine=MyISAM /*是该新闻对于的静态页面的名字*/
u MyISAM 和 InnoDB
1. MyISAM 不支持事务 , InnoDB支持事务
2. MyISAM速度相对快,InnoDB 速度相对慢.
3. MyISAM 不支持外键, InnoDB支持外键
外键的概念: PHP中用的不多,大家了解即可.
2. 添加两条初始化的数据
insert into news (title,content) values('hello1','北京你好');
insert into news (title,content) values('hello2','四川你好');
思考:
1. 这时,不同的用户没查看一次新闻,就会到数据库去查询一次. 这样做是不对的,因为新闻,文章, 他们的变换不多,所以,我可以第一次查询数据,并生成静态页面,news-idx.html, 然后我们第二次和以后,都直接返回该静态页面即可,
2. 现在开始改进 -》ob缓存
3. 思考-> 问题?
3.1 网址不是静态网址, 伪静态网站
3.2 如果我们的内容修改,我们将看不到修改的页面
先搞定这个问题.,
方法1: 通过比较文件的时间来 定时更新,即可,对于对应实时性要求不高的网站,是完全没有问题.
if(file_exists($html_name) && filemtime($html_name)+30> time() ){
echo "使用缓存";
echo file_get_contents($html_name);
exit;
}
方法2; 现在我们可以这样考虑,当我们添加新闻,修改新闻时,就实时的更新数据库同时去更新静态页面->使用模板技术
实现思路: smarty 模板替换-> 正则表达式
最总代码:
newsList.php
<?php
header("content-type:text/html;charset=utf-8");
echo "<h1>新闻列表</h1>";
echo "<a href='addNews.html'>添加新闻</a><hr/>";
echo "<table>";
echo "<tr><td>id</td><td>标题</td><td>查看详情</td></tr>";
//mysql.class.php 工具类来完成数据的获取
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newsdb",$con);
$sql="select * from news";
$res=mysql_query($sql,$con);
while($row=mysql_fetch_assoc($res)){
echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href=' news-id{$row['id']}.html'>查看详情</a></td></tr>";
}
echo "</table>";
//关闭资源
mysql_free_result($res);
mysql_close($con);
addNews.html
<head>
<title>新闻标题</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<!--我们在添加新闻时,就同时生成一个对应的新闻页面(比如你设计好的一个新闻内容显示模板)-->
<form action="newsAction.php" method="post">
<table>
<tr><td>新闻标题</td><td><input type="text" name="title"/></td></tr>
<tr><td>新闻内容</td><td><textarea cols="50" rows="10" name="content"></textarea></td></tr>
<tr><td><input type="submit" value="添加"/></td><td><input type="reset" value="重新填写"/></td></tr>
<!--隐藏区,用于告诉 newsAction.php 我请求什么-->
<input type='hidden' name='oper' value='add'/>
</table>
</form>
</html>
newsAction.php
<?php
function myreplace($row,$title,$content){
$row= str_replace("%title%",$title,$row);
$row= str_replace("%content%",$content,$row);
return $row;
}
//获取
$oper=$_POST['oper'];
if($oper=="add"){
//思路
$title=$_POST['title'];
$content=$_POST['content'];
//入库. Mysql.class.php
$con=mysql_connect("localhost","root","root");
if(!$con){
die("连接失败");
}
mysql_select_db("newsdb",$con);
$sql="insert into news (title,content) values('$title','$content')";
if(mysql_query($sql)){
//获取新闻id
$id=mysql_insert_id();
$html_filename="news-id".$id.".html";
$fp_html_file=fopen($html_filename,"w");
//读取模板文件
$tpl_file=fopen("news.tpl","r");
//一行一行的读
while(!feof($tpl_file)){
//读入一行
$row=fgets($tpl_file);
//我就一行一行的替换,我写一个函数来专门替换占位符.
$row=myreplace($row,$title,$content);
//把$row写入到新文件
fwrite($fp_html_file,$row);
}
//关闭文件.
fclose($fp_html_file);
fclose($tpl_file);
echo "添加成功, <a href='newsList.php'>点击查看新闻</a>";
}else{
echo "添加失败!";
}
}else if($oper=="update"){
}else if($oper=="delete"){
}
作用: 请大家完成,完成修改页面:
ob1.php <html> <input type="text" name="name" /> <style src="ab.css" type="text/css"/> <script type="text/javascrpt"> alert("hello"); </script> <?php $res=0; for ($i=0;$i<10;$i++){ $res+=$i; } echo $res; ?>
问题:
1. 请求ob1.php 页面后,浏览器共发出多少次http请求
a. 发出两次请求,一次是请求php页面本身
b. 如果发现有资源则继续请求 ab.css
2. 各部分的代码在哪里运行
说明: php代码要在服务器运行
html代码返回 js代码返回,在浏览器运
3.