phpwind的rewrite重寫原理

就是一般我們用echo print 輸出字符到頁(yè)面上的時(shí)候,意味著只要執(zhí)行到了echo,php就會(huì)立即輸出到客戶端,但php有幾個(gè)和緩沖相關(guān)的函數(shù),他可以控制你輸出的行為,就是不立馬輸出,而是等你調(diào)用了ob_flush/flush函數(shù),才輸出。而pw就是利用了這個(gè)原理,等頁(yè)面所有的內(nèi)容都生成完畢了,最后調(diào)footer()時(shí),ob_get_contents(),獲取緩沖的內(nèi)容,通過(guò)正則批量替換url,構(gòu)造rewrite的url格式。
關(guān)于ob,其實(shí)有兩種主要的使用場(chǎng)景,一個(gè)是實(shí)現(xiàn)頁(yè)面壓縮輸出 - ob_gzhandler;再一個(gè)是在ajax/自定義api返回?cái)?shù)據(jù)時(shí),程序執(zhí)行過(guò)程中,你不知道前面的程序是否有些意外的輸出字符如空格、空行等,他們?cè)跀?shù)據(jù)返回時(shí)會(huì)造成很多意外情況,所以可以在你輸出數(shù)據(jù)前,清除前面的緩沖內(nèi)容,重新開(kāi)始輸出。
官方默認(rèn)的重寫規(guī)則(注:重寫是web服務(wù)器 - 如apache、nginx或應(yīng)用容器tomcat的功能,不是程序語(yǔ)言自己的功能),如pw的一條重寫規(guī)則 - apache:
RewriteRule ^(.*)-htm-(.*)$ $1.php?$2
首先,我們分析他的構(gòu)成。當(dāng)我們打開(kāi) global.php 文件,找到 :
<?php
$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start();
?>
我們會(huì)發(fā)現(xiàn),這個(gè)全局文件打開(kāi)了一個(gè)ob_start,并且進(jìn)行一些判斷。這個(gè)是pw系統(tǒng)進(jìn)行rewrite的一個(gè)關(guān)鍵。
然后我們?cè)僬业絝ooter()函數(shù):
<?php
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(
"/<a(s*[^>]+s*)href=(["|']?)([^"'>s]+.php?[^"'>s]+)(["|']?)/ies",
"Htm_cv('3','<a1href="')",
$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("/\<a(\s*[^\>]+\s*)href\=([\"|\']?)((index|cate|thread|read|faq|rss)\.php\?[^\"\'>\s]+\s?)[\"|\']?/ies", "Htm_cv('\\3','<a\\1href=\"')", $html) : $html;
}</p> <p>/**
* url處理
*
* @param string $url
* @param string $tag
* @return string
*/
function Htm_cv($url, $tag) {
return stripslashes($tag) . urlRewrite($url) . '"';
}</p> <p>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的重寫規(guī)則在這里進(jìn)行字符的替換
$turl != $url && $turl .= $db_ext;
return $turl . $add;
}
相關(guān)文章
- 關(guān)于pw的重寫,phpwind用到了一般人不會(huì)太關(guān)注的一個(gè)技術(shù)點(diǎn),輸出緩沖(output buffer - ob_),下面我們就分析一下phpwind的rewrite重寫原理2014-01-24
- 偽靜態(tài)在phpWind的應(yīng)用,解釋相關(guān)說(shuō)明。2013-10-29
phpwind9.0系統(tǒng)的視覺(jué)進(jìn)化論(圖文)
近日phpwind內(nèi)部做了一次關(guān)于產(chǎn)品視覺(jué)方面的主題分享。會(huì)上phpwind主視覺(jué)設(shè)計(jì)師王杰同學(xué)分享了他在視覺(jué)設(shè)計(jì)中的心得和觀念。小編也有幸被邀請(qǐng)旁聽(tīng)分享,在分享會(huì)過(guò)后本小版2012-08-23phpwind 的編碼錯(cuò)誤導(dǎo)致cookie失效的解決,表象是無(wú)法注冊(cè)登錄
一個(gè)phpwind 8.0 utf8 系統(tǒng)錯(cuò)誤表現(xiàn)為無(wú)法注冊(cè)登錄,費(fèi)老勁調(diào)試,發(fā)現(xiàn) data/sql_config.php 文件由于在windows 記事本編輯后導(dǎo)致被自動(dòng)增加了bom2011-12-23Phpwind7.5應(yīng)用中心:基礎(chǔ)、第三方在線應(yīng)用等設(shè)置
應(yīng)用中心:基礎(chǔ)、第三方在線應(yīng)用、各種特殊功能帖的設(shè)置。它包括:2010-01-24phpwind7.5運(yùn)營(yíng)工具:站點(diǎn)運(yùn)營(yíng)必須工具集合
運(yùn)營(yíng)工具:站點(diǎn)運(yùn)營(yíng)必須工具集合。它包括:2010-01-24- 一個(gè)好的社區(qū)積分體系,能很好的帶動(dòng)論壇會(huì)員的積極性和粘合度,對(duì)活躍論壇氣氛,促進(jìn)會(huì)員發(fā)帖興趣,公平公正獎(jiǎng)勵(lì)等都有非常好的效果,PHPWind一直追求這個(gè)功能的協(xié)調(diào)2010-01-24
- 不同的地方,民俗、經(jīng)濟(jì)、生活習(xí)慣都有所不同,不同的行業(yè)也有不同的規(guī)則,這就導(dǎo)致了不同社區(qū)有不同的資源,不同的用戶,從而在社區(qū)運(yùn)營(yíng)和業(yè)務(wù)上有不同的側(cè)重。作2010-01-24
- 關(guān)鍵字描述:在線 關(guān)閉 論壇   < EOT > " /a> index.php 使打開(kāi)在線列表功能無(wú)效 打開(kāi)index.php 將:if($windid==$manager || $usertotal<2000)2009-06-06
- 關(guān)鍵字描述:巧用 Discuz!7.0 后臺(tái) 灌水功能 BBS 論壇 康盛創(chuàng)想 建站產(chǎn)品 Discuz!7.0是康盛創(chuàng)想(Comsenz)公司于2008年12月份發(fā)布的一款論壇BBS建站產(chǎn)品。Discuz!72009-06-06