PHP页面静态化两种实现方案(模板标签)

七月 20, 2019 | views
Comments 0

静态化页面的好处就不说了,现在我们下文要介绍的实现方法就是利用定义的模板页面和标签然后再利用php读取模板页面之后进入分析替换就可以了,具体我们来看两个例子.

方案:使用模板替换技术(没有时间延迟),代码如下:

  1. /* 
  2. |------------------ 
  3. | <www.phpfensi.com> 
  4. |------------------ 
  5. */ 
  6. $oper = $_POST['oper'];//添加操作 
  7. if($oper === 'add'
  8.     $title = $_POST['title']; 
  9.     $content = $_POST['content']; 
  10.      
  11.     //如果严格按MVC,这里应该调用model了 
  12.     $con = mysql_connect('localhost''root''123456'); 
  13.     if(!$con
  14.     { 
  15.         die('连接失败!'); 
  16.     } 
  17.     mysql_select_db('news'$con); 
  18.     $sql = "insert into question(null, '$title', '$content', '')"
  19.     if(mysql_query($sql$con)) 
  20.     { 
  21.         //1.生成静态文件  
  22.         $id = mysql_insert_id(); 
  23.         $html_filename = 'news-id'.$id.'.html'
  24.         $html_fp = fopen($html_filename'w'); 
  25.          
  26.         //2.把模板文件读取(news.html) 
  27.         $fp = fopen('news.tpl''r'); 
  28.         //r 只读方式打开; r+ 读写方式打开; w 写入方式打开:文件内容将被清空!如果文件不存在将创建; a 以追加的方式打开 
  29.          
  30.         //3.循环读取 
  31.         //如果没有读到文件的最后,就一直读取 
  32.         while(!feof($fp)) 
  33.         { 
  34.             //一行行读 
  35.             $row = fgets($fp); 
  36.             //把占位符替换掉 => 可以自定义完整的替换规则函数 
  37.             $row = str_replace('%title%'$title$row);//如果不重新赋值$row, $row值不会改变 
  38.             $row = str_replace('%content%'$content$row); 
  39.              
  40.             fwrite($html_fp$row);//4.将内容写入静态文件 
  41.         } 
  42.         //5.文件必须关闭 
  43.         fclose($html_fp); 
  44.         fclose($fp); 
  45.          
  46.         echo "添加成功。<a href='newslist.php'>点击查看新闻!</a>"
  47.     } 
  48.     else 
  49.     { 
  50.         die('添加失败!'); 
  51.     } 

此时在新闻列表内,点击查看详情的链接,可以改成生成的静态页面地址,直接进入静态文件,代码如下:

  1. <html>  
  2.     <head>  
  3.         <meta charset="utf-8" />  
  4.         <title>%title%</title>  
  5.     </head>  
  6.     <body>  
  7.         <h1>%title%</h1>  
  8.         <pre>%content%</pre>  
  9.     </body>  
  10. </html> 

方案:如果静态文件存在,且生成时间30秒内,直接返回静态页面(有时间延迟),代码如下:

  1. /* 
  2. |------------------ 
  3. | <www.phpfensi.com> 
  4. |------------------ 
  5. */ 
  6. header('content-type:text/html;charset=utf-8'); 
  7. $id = $_GET['id'] ? intval($_GET['id']) : ''
  8. if($id === ''die('请输入要查询的新闻id!'); 
  9. $html_file = "news-id-".$id.".html"
  10. //1.主要代码 
  11. if(file_exists($html_file) && filemtime($html_file) + 30 >= time()) 
  12.     echo '静态页面:'
  13.     echo file_get_contents($html_file);exit
  14. //这里也可以使用DB工具类 
  15. $con = mysql_connect('localhost''root''123456'); 
  16. if(!$con
  17.     die('连接失败!'); 
  18. mysql_select_db('testdb'$con); 
  19. $sql = "select * from bo_question where question_id = $id"
  20. $res = mysql_query($sql$con); 
  21. if($row = mysql_fetch_assoc($res)) 
  22.     ob_start();//2.启动ob缓存 
  23.     header('content-type:text/html;charset=utf-8'); 
  24.     echo '<head><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>'
  25.     echo '<table style="border:1px solid red;" cellspacing="0" width="400px" height="200px">'
  26.     echo '<tr><td>问题详细内容</td></tr>'
  27.     echo "<tr><td>标题:{$row['question_title']}</td></tr>"
  28.     echo "<tr><td>详细:{$row['question_detail']}</td></tr>"
  29.     echo '</table>'
  30.     $ob_str = ob_get_contents(); 
  31.     //3.把ob_str保存到一个静态文件页面,取文件名有讲究:1.唯一标识该新闻 2.利于seo 
  32.     file_put_contents("news-id-".$id.".html"$ob_str); 
  33.    
  34.   //关闭数据库连接(非必须; 非长连接下,脚本执行完会自动关闭)  
  35.   mysql_close($con); 
  36. }else
  37.     echo '没有查询到资源!'

从上面看我们头一种生成静态页面的方法更合适于页面的后期维护哦,后者是比较难维护的哦,推荐使用第一种办法.



zend