• 页面静态化


    页面静态化

     

    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左右

    ② htmlPHP访问的效率表

     

     

    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. 

  • 相关阅读:
    USES_CONVERSION宏(转)
    推送本地仓库至多个远程仓库(转)
    .gitignore的使用
    重命名分支
    不支持尝试执行的操作——————MFC窗口打开错误
    error C1010:在查找预编译头文件时遇到意外的文件结尾——————vs错误
    抓边(一)——————————————使用halcon测量助手
    CString, string, char *之间的相互转换(转)
    css模块化
    继承、原型链、在组件开发上的应用
  • 原文地址:https://www.cnblogs.com/suihui/p/3238096.html
Copyright © 2020-2023  润新知