PHP是一種非常常用的程序設(shè)計(jì)語(yǔ)言,而其中的CGI模型也是經(jīng)常被使用到的一種設(shè)計(jì)模式。CGI是指通用網(wǎng)關(guān)接口(Common Gateway Interface),它可以使得Web服務(wù)器與外部程序進(jìn)行交互,這些外部程序可以是由Python,Perl,PHP等語(yǔ)言編寫的腳本。在PHP中,實(shí)現(xiàn)CGI模型的核心組件是SAPI,也就是Server Application Programming Interface。
在CGI模型中,當(dāng)Web服務(wù)器接收到一個(gè)客戶端請(qǐng)求時(shí),首先會(huì)通知PHP解釋器,然后PHP解釋器會(huì)解析PHP腳本,最后將PHP腳本的結(jié)果交給Web服務(wù)器,而Web服務(wù)器則直接將結(jié)果傳送回給客戶端。這個(gè)過(guò)程中,PHP解釋器與Web服務(wù)器是通過(guò)標(biāo)準(zhǔn)輸入輸出(stdin、stdout)和環(huán)境變量進(jìn)行交互的。
例如,在實(shí)現(xiàn)一個(gè)簡(jiǎn)單的網(wǎng)站訪問統(tǒng)計(jì)的場(chǎng)景中,可以使用CGI模型來(lái)實(shí)現(xiàn)。首先,在Web服務(wù)器中設(shè)置好CGI程序的目錄及訪問地址,然后將PHP腳本按照CGI協(xié)議進(jìn)行編寫,存儲(chǔ)到CGI程序的目錄中。當(dāng)客戶端請(qǐng)求訪問時(shí),Web服務(wù)器會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給CGI程序,CGI程序會(huì)將統(tǒng)計(jì)數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,同時(shí)返回客戶端期望的結(jié)果。
另一個(gè)使用CGI模型的常見場(chǎng)景是實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè),例如博客網(wǎng)站。在這種網(wǎng)站中,博客文章以HTML頁(yè)面的形式呈現(xiàn)給用戶,但是HTML頁(yè)面需要根據(jù)不同的文章進(jìn)行動(dòng)態(tài)生成。這時(shí)候可以使用PHP腳本作為CGI程序,根據(jù)訪問的請(qǐng)求動(dòng)態(tài)生成文章內(nèi)容。如果文章已經(jīng)保存到數(shù)據(jù)庫(kù)中,PHP腳本可以從數(shù)據(jù)庫(kù)中讀取文章內(nèi)容,然后根據(jù)模板引擎(比如Smarty)進(jìn)行渲染,最后輸出HTML頁(yè)面給客戶端。
assign('title', $article['title']); $smarty->assign('content', $article['content']); echo $smarty->fetch('article.tpl'); ?>
使用CGI模型可以方便地實(shí)現(xiàn)許多功能強(qiáng)大的Web應(yīng)用程序,其優(yōu)勢(shì)在于可以使用多種不同的語(yǔ)言進(jìn)行編寫,而且不需要對(duì)Web服務(wù)器的內(nèi)部工作原理進(jìn)行過(guò)多的了解。但是,CGI模型也存在一些缺點(diǎn),例如每次執(zhí)行PHP腳本都需要重新啟動(dòng)PHP解釋器,會(huì)造成一定的性能損失,而且CGI模型對(duì)于處理大量并發(fā)請(qǐng)求的能力也有一定的限制。