大流量程序设计与实现--系列三

来源:互联网 发布:数据库系统答案 编辑:程序博客网 时间:2024/05/05 17:05

大流量程序设计与实现--系列三

接上篇.....

二、完成一个简单的新闻管理系统-页面静态化(全站静态化)

1使用ob缓存机制

  1.1 表的结构

      create table news(

       id int unsigned primary key auto_increment,

       title varchar(128) not null default '',//注意要写default,才更高效

       content varchar(256) not null default '',

       filename varchar(125) not null default '' //缓存数据存放文件

    )engine=MyISAM charset utf8

  1.2 newsList.php

      //列出新闻列表

      //这里,使用简单方式来操作

      <?php

      $con = mysql_connect("localhost", "root", "root");

      if(!$con){

        die("connect error");

      }

      mysql_select_db("database", $con);

      $sql = "select * from news";

      $res = mysql_query($sql, $con);

      while($row = mysql_fetch_assoc($res)){

        echo $row['id'].' : '.$row['title'].'\n';

      }

      //关闭资源(通常不需要手动释放,会被自动释放)

      mysql_free_result($res);

      //关闭连接(通常不需要手动关闭,因为是非持久的,会被自动释放)

      mysql_close($con);

  1.3 静态页面的文件名,有讲究 

      1.3.1 唯一性

      1.3.2 利于seo

            ob_start();

            echo "<head><meta http-equiv='content-type' content='text/html;charset=utf8'";

            echo "your contents";

            $obContents = ob_get_contents();

            file_put_contents("news-id-".$id.".html", $obContents);

      1.3.3 //先判断需要的id的缓存文件是否存在

            $html_file = 'news-id-'.$id.'.html';

            if(file_exists($html_file)){

              echo file_get_contents($html_file);

              exit();

            }

  1.4 静态页面的变化

      1.4.1 设置一分钟之内,自动从数据库更新

            if(file_exsits($html_file) && filemtime($html_file)+60 >= time()){

            }

      1.4.2 每次更新文章,同时生成一下静态文件,模板替换技术

            读入模板、正则表达式或者其它替换技术,把结果替换掉占位符

            输出静态页面html

            尽量不要用$_REQUEST来接收,因为有安全隐患,手册上有说明

            能用单引号,就不要用双引号,前者效率更高。

            view视图/界面层

            controller控制层:接收数据,并调用相应的model完成任务,结果分配给view

            model业务模型层

            mvc里面的model模型层可再分为:

              dao(data access object数据访问对象db.class.php)

              数据持久层(pdo 为了支持不同的数据库)

      1.4.2.1 添加时候的静态化:insert.php

            $sql = "insert into news values(null, '$title', '$contents', '')";

            if(mysql_query($sql, $con)){

              //生成静态文件

              $id = mysql_insert_id();

              $html_filename = 'news-id-'.$id.'.html';

              $html_fp = fopen($html_filename, 'w');

              //把模板文件读取进来

              //file_get_contents();//但是读取大文件的时候,会出现读不全

              //所以这里一行一行的读取

              $fp = fopen('news.tpl', 'r');//千万注意打开方式w

              while( !feof($fp) ){

                //一行一行的读取

                $row = fgets($fp);

                //把占位符 替换掉。

                $row = str_replace('%title%', $title, $row);

                $row = str_replace('%content%', $content, $row);

                fwrite($html_fp, $row);

              }

              //关闭文件,必须关闭,关闭顺序可以任意

              fclose($html_fp);

              fclose($fp);

              echo "添加成功!点击查看";

            }else{

              die("添加失败");

            }

      1.4.3 直接删除相应的静态缓存文件

            1.4.3.1 更新时候静态化

            1.4.3.2 首页静态化,非常重要,因为访问量大

            待发布......

0 0