php的伪静态方法

php页面的静态化

一般来说 用php转换输出html页面有两种办法:­

第一种:利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。 ­

这里我用smarty做例子,说明如何生成静态页­

require('smarty/Smarty.class.php');­

$t = new Smarty;­

$t->assign("title","Hello World!");­

$content = $t->fetch("templates/index.htm");­

//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了­

$fp = fopen("archives/2005/05/19/0001.html", "w");­

fwrite($fp, $content);­

fclose($fp);­

?> ­

第二种方法:利用ob系列的函数。这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:­

ob_start();­

echo "Hello World!";­

$content = ob_get_contents();//取得php页面输出的全部内容­

$fp = fopen("archives/2005/05/19/0001.html", "w");­

fwrite($fp, $content);­

fclose($fp);­

?> ­

我选用的第2种方法 也就是用ob系列的函数 ­

我刚开始看这个的时候有点不太明白 后来才知道ob是output buffering的意思 也就是输出缓存­

当你准备输出的时候 所有的数据都保存在ob里面 服务器解析完php以后 把所有要输出到客户端的html代码都存放在ob里面 如果我们要输出html静态页面 只要把缓存取出来写入一个html页面即可­

所以原理其实是很简单的­

这里用到了几个函数 由于我初学php 很多函数我还不了解 所以这里也说明一下 希望可以帮助大家­

ob_start():开始“捕捉”缓存 也就是从这里开始 打开浏览器的缓存­

ob_end_flush():关闭浏览器缓存­

ob_get_content():读取缓存内容­

fopen("文件路径","打开模式")打开文件

这个函数的打开模式有好几种 下面介绍几种主要的模式:­

'r' 只读方式打开,将文件指针指向文件头。??­

'r+' 读写方式打开,将文件指针指向文件头。??­

'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。??­

'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。??­

fwrite("文件名称","写入内容") 写入文件­

fclose() 关闭文件


php的伪静态

1.根据$_SERVER['PATH_INFO']来操作实现。
   举个列子比如你的网站的地址是 http://127.0.0.1/show_new.php/look-id-1.shtml
你echo $_SERVER['PATH_INFO'] 出来的结果就会是 /look-id-1.shtml 看到这个我想大家可能已经明白了。
完整的demo
index.php

复制代码代码如下:

index.php

$conn=mysql_connect("localhost","root","root")or dir("连接失败");
mysql_select_db("tb_demo",$conn);
$sql="select * from news";
$res=mysql_query($sql);
header("content-type:text/html;charset=utf-8");
echo "<h1>新闻列表</h1>";
echo "<a href='add_news.html'>添加新闻</a><hr/>";
echo "<table>";
echo "<tr><td>id</td><td>标题</td><td>查看详情</td><td>修改新闻</td></tr>";
while($row=mysql_fetch_assoc($res)){
 echo "<tr><td>{$row['id']}</td><td>{$row['title']}</td><td><a href='show_new.php/look-id-{$row['id']}.shtml'>查看详情</a></td><td><a href='#'>修改页面</a></td></tr>";
}
//上面的红色的地址本来该是show_news.php?act=look&id={$row['id']}
echo "</table>";
//关闭资源
mysql_free_result($res);
mysql_close($conn);


show_new.php页面 
复制代码代码如下:

show_new.php

header("Content-type:text/html;charset=utf-8");
$conn=mysql_connect("localhost","root","root");
mysql_select_db("tb_demo",$conn);
mysql_query("set names utf8");
 $pa = $_SERVER['PATH_INFO'];
//$pa  打印出来的值是  /look-id-1.html
//通过正则表达式匹配获取的url地址
if(preg_match('/^\/(look)-(id)-([\d])\.shtml$/',$pa,$arr)){
 $act = $arr[1]; //这个是请求的look方法
 $id = $arr[3];  //这个是获取的id 值
 $sql="select * from news  where id= $id";
 $res=mysql_query($sql);
 $res = mysql_fetch_assoc($res);
 echo $res['title']."<hr>".$res['content'];
}else{
 echo "url地址不合法";
}
mysql_close($conn);


看到上面的这个我想大家肯定懂了吧   其实这种方式用的不多的下面的给大家说第二种方法了啊

2.根据配置.htaccess来实现。
  先说下.htaccess文件怎么创建吧,在网站根目录下建立个记事本然后双击打开点击另存为 文件名写成 
.htaccess ,保存类型选择所有文件,编码选择utf-8的编码好的这是你就在目录看到这个.htaccess文件了

首先在apache 开启mod_rewrite.so,AllowOverride None  这里有两处 替换为 AllowOverride All

比如href 地址写成 one_new-id-1.shtml //这个意思是one_new.php?id=1
这里的.htaccess 就可以这么写了

复制代码代码如下:

<IfModule rewrite_module>
#写你的rewrite规则
RewriteEngine On
# 可以配置多个规则,匹配的顺序是从上到下
RewriteRule  one_new-id-(\d+)\.shtml$ one_new.php?id=$1 //这里的$1 代表的是第一个参数啊
RewriteRule  abc_id(\d+)\.html$     error.php
#设置404错误
#ErrorDocument  404  /error.php
</IfModule>

你在one_new.php 页面echo $_GET['id'] 肯定会输出 id的值了


eg

<?php
/**
 * php页面静态化
 * 静态化分为 真静态和伪静态
 * 静态化的有点在于 SEO 和 安全性 使用缓存机制还可以大大提高网站的速度
 */


/**
 * php自带的缓存机制
 * 需要在php.ini中进行配置
 * 或者使用ob_start()-> output_buffering:on
 * 关于几个缓存的函数:ob_start();ob_clean();ob_get_content();ob_end_clean();关闭缓存同时清空
 * ob_flush();输出缓存里面的内容并且清空,但是不关闭 ob_end_flush();关闭同时输出
 */


/**/
ob_start();//开启缓存
echo 'yyy';//没有开启缓存的情况下会报错,因为没有遇到header的时候,php默认发送一个header,这个header无法修改
header('content-type:text/htm;charset=utf-8');
echo '123';
ob_get_contents();//得到缓存的内容
ob_end_clean();
echo 'aa';//放在程序缓存里面
header('content-type:text/htm;charset=utf-8');//运行的时候会报错,因为缓存已经关闭




/*
 * 利用php自带的缓存机制做真缓存
 * 真缓存的页面的内容应该是长期都不需要变的,并且不同用户看到的东西都是一样的
 * 原理:用户第一次访问的时候查询数据库,然后得到缓存区的内容,并且放到缓存文件里面
 * */
/**
 */
ob_start();
//判断缓存文件是否存在
$html_filename='static.html';
if(file_exists($html_filename) &&  (filemtime($html_filename)+30) > time())//超过30秒则重新生成
{
    //直接取出缓存页面的内容
    echo file_get_contents($html_filename);
    exit;
    
} 
echo 'Your content';
$html_content=ob_get_contents();
$html_filename='static.html';
file_put_contents($html_filename,$html_content);


/*
 *  * 上述原理的缺陷:1.实时性不够  2.不利于seo优化
 * 解决办法:在数据库发生增加和更新的时候更新缓存文件
 * */


if($_REQUEST['act'] == 'add')//update 也是
{
  //先获取模版文件
  $template_content=file_get_contents('template.tpl');
  //替换标签
  $php_content=str_replace("{",'<?php echo ',$template_content);
  $php_content=str_replace("}",'?>',$template_content);
  //生成缓存文件
  $php_tplname='php_tpl.php';
  file_put_contents($php_tplname,$php_content);
  include(file_put_contents);
  $html_content=ob_get_contents();
  $html_filename='static.html';
  file_put_contents($html_filename,$html_content);
  
}


/**
 * 真静态的缺陷:生成的 缓存文件很多,占硬盘
 * 对于海量的html生成,可以考虑用伪静态
 */


$str='123,33,333';
preg_match('/\d\d\d\d/is',$str,$arr);//匹配连续四个出现的数字 返回到arr 只是匹配一个 arr[0]
preg_match('/(\d)(\d)/is',$str,$arr);//这时候arr返回三个 0放置匹配的字符串,arr[n]按照表达式顺序返回匹配的字符串


//对于需要全部匹配的使用preg_match_all()函数;正则表达式里面需要'' 不要使用""


/**
 * 使用apache的rewrite机制
 * 注意点:apache的配置 开启rewrite module 也要设置derectory的权限 allowoverride from all 
 * 文件 .htacss //匹配规则是从上而下的,可以设置error页面
 * RewireEngine On
 * news-id(\d)\.html$  news.php?id=$1
 * news-id(\d).html$    error.php      #错误页面放到最后
 */


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值