在說單一入口之前,先說說多入口。Discuz!, PHPCMS 2008, DedeCMS 都是采用多入口的結(jié)構(gòu)。
多入口,即通過訪問不同的 php 文件運行對應(yīng)的功能。如:
/index.php - 網(wǎng)站首頁
/show.php?id=1 - 內(nèi)容頁
/list.php?page=2 - 列表頁
/login.php - 用戶登錄頁
……
多入口都是通過包含頭文件統(tǒng)一運行環(huán)境,即初始化系統(tǒng)。如:
/include/common.inc.php - 頭文件,PHP 文件 include 它后便完成了初始化工作,例如可以使用系統(tǒng)的基礎(chǔ)函數(shù)。
/index.php
<?php
include './include/common.inc.php' // 包含頭文件,基本是每個入口 php 文件的首行代碼。
……
?>
拿 PHPCMS 2008 的頭文件來舉例, PHPCMS 2008 在頭文件中完成了基礎(chǔ)函數(shù)的加載,常量的定義,系統(tǒng)配置的載入,POST,GET 數(shù)據(jù)的過濾,數(shù)據(jù)庫類的實例化,保持用戶登錄等等等等一系列操作。
反正就是個 php 文件嘛,想做什么直接往里加就是了。
所以,所謂的安全檢查,統(tǒng)一檢查,權(quán)限控制等,用頭文件同樣可以實現(xiàn),所謂“單一入口”只不過是換了一種形式,并無實質(zhì)性的變化。
以前我就是這樣認為的。
現(xiàn)在,假設(shè)用 CMS 為客戶建一個站( CMS 是多入口的):建欄目,配網(wǎng)站,卡拉卡拉一段忙碌后,網(wǎng)站可以上線了,放在這個地址下:
localhost/gz/
沒錯,這次建的是 gz 這個地區(qū)的地區(qū)站,客戶認為網(wǎng)站做得不錯,希望做多一個 bj 地區(qū)的地區(qū)站。 bj 站的欄目結(jié)構(gòu),內(nèi)容,功能模塊等都與 gz 站有所不同。
好,現(xiàn)在問題來了,上面提到的三個多入口的系統(tǒng),都設(shè)計成一套程序一個環(huán)境,即一套程序只對應(yīng)一個數(shù)據(jù)庫。對于上面的需求( bj 站),除非修改整套程序的結(jié)構(gòu)(這是不切實際的),否則就只能復(fù)制多一份源代碼,指向另一個數(shù)據(jù)庫。
于是,我便復(fù)制多一份源代碼,指向 bj 數(shù)據(jù)庫( gz 站則指向 gz 數(shù)據(jù)庫),建欄目,配網(wǎng)站,卡拉卡拉一優(yōu)忙碌后,網(wǎng)站又可以上線了,放在這個地址下:
localhost/bj/
所以,現(xiàn)在有兩套一樣的程序在運行。
然后,客戶想改一改 gz 站的功能,于是我修改了 gz 的代碼。然后,客戶想改一改 bj 站的功能,于是我修改了 bj 的代碼。然后,客戶想在 bj 站上做與 gz 同樣的修改,于是我得把 gz 的修改復(fù)制到 bj 中,然后……
于是,我不得不維護兩份實際上是“一樣”的代碼。
假如網(wǎng)站運營得不錯,客戶又建了若干個地區(qū)站,我維護的便是若干份“一樣”的代碼——這根本就是惡夢。
現(xiàn)在到單一入口登場了。
單一入口,就是訪問同一個文件加不同參數(shù)運行不同的功能。如:
/index.php - 單一入口,默認顯示首頁
/index.php?action=show&id=1 - 用 action 參數(shù)指明顯示內(nèi)容頁
/index.php?action=list&page=2 - 顯示列表頁
/index.php?action=login - 用戶登錄頁
……
index.php 這個入口做的便是頭文件做的初始化操作(外加一些調(diào)度),包括加載網(wǎng)站的配置。
現(xiàn)在我們來假設(shè)建站用的 CMS 是單一入口的設(shè)計,在完成 gz 站后,面對同樣的需求( bj 站),我只需要在 /bj/ 目錄入多建一個入口文件,加載指向 bj 數(shù)據(jù)庫的配置,再配配數(shù)據(jù)卡拉卡拉什么的,就完事了!
于是,我只需要維護一份源代碼。
這便是單一入口特有的作用——構(gòu)造環(huán)境。
使用哪個數(shù)據(jù)庫就是環(huán)境的一種,類似的還有:用內(nèi)存緩存還是文件緩存,用 mysql 還是 mssql 等。
除非在設(shè)計階段特別留意,否則,頭文件的結(jié)構(gòu)都會被寫成“一套程序一個環(huán)境”的結(jié)構(gòu)。而采用單一入口結(jié)構(gòu),無論是否留意,都可以輕易實現(xiàn)“一套程序多個環(huán)境”。這才是使用單一入口的真正理由。