phpwind的rewrite重寫原理

2021-09-06 13:36:00 字數 1818 閱讀 9372

沒有深入過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()函式:

<?php

function

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...