沒有深入過pw,被人問到這方面的問題,搜尋了一下,發現了一篇博文,但原部落格已打不開。
phpwind 8.7
有人說過「phpwind「在技術是成功的,而dz在商業上成功的,在rewrite的控制中,pw做得遠遠比dz好。
關於pw的重寫,首先他用到了一般人不會太關注的乙個技術點,輸出緩衝(output buffer - ob_):
就是一般我們用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 檔案,找到 :
<?php$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start
();?>
我們會發現,這個全域性檔案開啟了乙個ob_start,並且進行一些判斷。這個是pw系統進行rewrite的乙個關鍵。
然後我們再找到footer()函式:
<?phpfunction
footer()
$ft_gzip=($db_obstart==1 ? "gzip enabled" : "gzip disabled").$db_union[3];
if ($db_footertime == 1)
$ft_time=get_date($timestamp,'m-d h:i');
include printeot('footer');
$output = str_replace(array('',''),array('',''),ob_get_contents
());
if($db_htmifopen
)
ob_end_clean
();
$db_obstart == 1 ? ob_start('ob_gzhandler') : ob_start
();
echo
$output
;
flush
;
exit;}
?>
common.php中:
function parsehtmlurlrewrite($html, $flag) /*
* * url處理
* * @param string $url
* @param string $tag
* @return string */
function htm_cv($url, $tag
) function urlrewrite($url
)
phpwind的rewrite重寫原理
沒有深入過pw,被人問到這方面的問題,搜尋了一下,發現了一篇博文,但原部落格已打不開。phpwind 8.7 有人說過 phpwind 在技術是成功的,而dz在商業上成功的,在rewrite的控制中,pw做得遠遠比dz好。關於pw的重寫,首先他用到了一般人不會太關注的乙個技術點,輸出緩衝 outpu...
解析phpwind的外掛程式體系
看phpwind的官方 發現有個很重要版塊為 phpwind 外掛程式開發 第一感覺是phpwind有個很完善的外掛程式體系,吸引開發者來基於外掛程式體系進行二次開發。於是乎我饒有興趣地解析一下phpwind的外掛程式體系的實現。我先說說在我看來外掛程式體現比較重要的兩個特徵 對於第乙個特徵phpw...
解析phpwind的外掛程式體系
看phpwind的官方 發現有個很重要版塊為 phpwind 外掛程式開發 第一感覺是phpwind有個很完善的外掛程式體系,吸引開發者來基於外掛程式體系進行二次開發。於是乎我饒有興趣地解析一下phpwind的外掛程式體系的實現。我先說說在我看來外掛程式體現比較重要的兩個特徵 對於第乙個特徵phpw...