phpwind的pw重写

时间:6年前   阅读:4634

关于pw的重写,phpwind用到了一般人不会太关注的一个技术点,输出缓冲(output buffer - ob_),下面我们就分析一下phpwind的rewrite重写原理,一起来了解下其中的详情吧。

就是一般我们用echo print 输出字符到页面上的时候,意味着只要执行到了echo,php就会立即输出到客户端,但php有几个和缓冲相关的函数,他可以控制你输出的行为,就是不立马输出,而是等你调用了ob_flush/flush函数,才输出。而pw就是利用了这个原理,等页面所有的内容都生成完毕了,最后调footer()时,ob_get_contents(),获取缓冲的内容,通过正则批量替换url,构造rewrite的url格式。

关于ob,其实有两种主要的使用场景,一个是实现页面压缩输出 - ob_gzhandler;再一个是在ajax/自定义api返回数据时,程序执行过程中,你不知道前面的程序是否有些意外的输出字符如空格、空行等,他们在数据返回时会造成很多意外情况,所以可以在你输出数据前,清除前面的缓冲内容,重新开始输出。

官方默认的重写规则(注:重写是web服务器 - 如apache、nginx或应用容器tomcat的功能,不是程序语言自己的功能),如pw的一条重写规则 - apache:

代码如下:

RewriteRule ^(.*)-htm-(.*)$ $1.php?$2

首先,我们分析他的构成。当我们打开 global.php 文件,找到 :

代码如下:

$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
 ?>

我们会发现,这个全局文件打开了一个ob_start,并且进行一些判断。这个是pw系统进行rewrite的一个关键。

然后我们再找到footer()函数:

代码如下:

function footer(){
 global $db,$db_obstart,$db_footertime,$db_htmifopen,$P_S_T,$mtablewidth,$db_ceoconnect,$wind_version,$imgpath,$stylepath,$footer_ad,$db_union,$dbinfo,$timestamp;
 Update_ol();
 if($db){
 $qn=$db->query_num;
 }
 $ft_gzip=($db_obstart==1 ? "Gzip enabled" : "Gzip disabled").$db_union[3];
 if ($db_footertime == 1){
 $t_array = explode(' ',microtime());
 $totaltime = number_format(($t_array[0]+$t_array[1]-$P_S_T),6);
 $wind_spend = "Total $totaltime(s) query $qn,";
 }
 $ft_time=get_date($timestamp,'m-d H:i');
 include PrintEot('footer');
 $output = str_replace(array('',''),array('',''),ob_get_contents());
 if($db_htmifopen){
 $output = preg_replace(
 "/]+s*)href=(["|']?)([^"'>s]+.php?[^"'>s]+)(["|']?)/ies",
 "Htm_cv('3',' $output
 );
 }
 ob_end_clean();
 $db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
 echo $output;
 flush;
 exit;
 }
 ?>

common.php中:

代码如下:

function parseHtmlUrlRewrite($html, $flag) {
 return $flag ? preg_replace("/\]+\s*)href\=([\"|\']?)((index|cate|thread|read|faq|rss)\.php\?[^\"\'>\s]+\s?)[\"|\']?/ies", "Htm_cv('\\3',' } 
/**
 * url处理
*
 * @param string $url
 * @param string $tag
 * @return string
 */
 function Htm_cv($url, $tag) {
 return stripslashes($tag) . urlRewrite($url) . '"';
 }

function urlRewrite($url) {
 global $db_htmifopen, $db_dir, $db_ext;
 if (!$db_htmifopen) return $url;
 $tmppos = strpos($url, '#');
 $add = $tmppos !== false ? substr($url, $tmppos) : '';
 $turl = str_replace(array('.php?', '=', '&', '&', $add), array($db_dir, '-', '-', '-', ''), $url);//pw的重写规则在这里进行字符的替换
$turl != $url && $turl .= $db_ext;
 return $turl . $add;
 }

本站声明:网站内容来源于网络,如有侵权,请联系我们https://www.qiquanji.com,我们将及时处理。

微信扫码关注

更新实时通知

上一篇:CSS background-image 背景图像

下一篇:50ETF期权分仓开户是真的假的?

网友评论

请先 登录 再评论,若不是会员请先 注册