我是幾年前寫著struts一路走來的,后來開始用php,喜歡php的簡單。
隨著項(xiàng)目參與人員的增長,必須要有規(guī)范,要有流程,所以開始研究了一些框架,自己也封裝了簡單的router,mvc部分。
最近在看另一個(gè)php的框架的時(shí)候,突然感覺有點(diǎn)疑惑。
在類似java這種應(yīng)用程序中,我們封裝的框架部分可以一直持久在內(nèi)存中,不必每次加載。但是php的機(jī)制是一次請求一次加載。那么每一個(gè)請求,都要處理加載配置文件,加載一堆封裝的東西是不是有點(diǎn)太浪費(fèi)了。
那是不是php也會(huì)把一些東西放在內(nèi)存呢?對于這一塊請大牛給解釋解釋。
走同樣的路,發(fā)現(xiàn)不同的人生
首先不得不吐槽下,php在這方面真的“很弱”,“很弱”并不代表php真很恨“差勁”,不可否認(rèn),php是最好的動(dòng)態(tài)模版語言。
php是動(dòng)態(tài)的解釋型語言,在語言這個(gè)角度提供的功能非常有限,大概這也就是為什么都感覺php上手非常容易的原因吧。于是我們摸索/探索,總結(jié)出了很多優(yōu)秀的框架(Yii, Zend Framework...),集合了很多牛逼的的技術(shù)(緩存/隊(duì)列/集群/復(fù)制集/異步/配置系統(tǒng)/日志系統(tǒng)/監(jiān)控系統(tǒng)/自動(dòng)化...)到了這個(gè)層面也就是出現(xiàn)了樓主的疑惑(php框架的一些疑惑),首先要恭喜你,你最少到了php開發(fā)的中級水平,好多人都不敢嘗試。這種疑惑是正常反應(yīng)。因?yàn)槔斫獾亩嗔?,你就?huì)想整個(gè)過程,如果每次請求處理都這樣,確實(shí)有點(diǎn)效率底下,php在代碼層次(PHP5統(tǒng)稱OP+)提供了加速器/緩存器,據(jù)說可以提高30%+以上的性能,用過的可以pass過。其實(shí)早在幾年前l(fā)aruence就反思過這個(gè)問題,并開發(fā)出了Yaf(框架在php啟動(dòng)的時(shí)候已經(jīng)駐留在內(nèi)存中了),這里我就不多講Yaf,有興趣你可以去看下。
apc、 zend optimizer plus、也就是 php 5.5 起的 opcache 。
都是預(yù)編譯文件并把 opcode 緩存在內(nèi)存中, 這是解決你困惑的常規(guī)方法, 建議適當(dāng)使用, 可以給 php 提速 20 到 300 個(gè)百分點(diǎn)。
但對于無論 php 還是 java, 瓶頸其實(shí)都在數(shù)據(jù)庫 io 上, 把文件加載、配置步驟省去之后,一般提速都不會(huì)太多 20 到 100 個(gè)百分點(diǎn), 尤其是數(shù)據(jù)庫操作頻繁的。
講的主要針對的是你提問,其他不相關(guān)的就不涉獵。
PHP 本身是不會(huì)常駐緩存的,一個(gè)請求結(jié)束,PHP也就停止執(zhí)行了。這正是PHP的特點(diǎn),無須考慮內(nèi)存、并發(fā)等等等東西。
不過你所說的
“那么每一個(gè)請求,都要處理加載配置文件,加載一堆封裝的東西是不是有點(diǎn)太浪費(fèi)了。”
并不完全準(zhǔn)確。主流的PHP框架都是有緩存的,緩存機(jī)制避免了這個(gè)問題。
PS:看到?jīng)]人回答,估計(jì)是被樓主寫的 “對于這一塊請大牛給解釋解釋?!?/em> 嚇跑了,我不是大牛,普通 PHP 程序員一名,特此聲明。
php有類似java字節(jié)碼的opcode cache機(jī)制,server中運(yùn)行的php文件會(huì)以編譯后的opcode的形式緩存在內(nèi)存中
常見的opcode cache參考 維基:PHP加速器列表
5.5后PHP官方內(nèi)置了Zend Optimizer。
所以順便建議配置文件、模版等都以php格式存在,以最大化利用opcode cache,減少磁盤IO
可以把一些固定的配置項(xiàng)寫到apache的環(huán)境變量里面,php里面用 $_ENV來讀取。apache每fork出一個(gè)進(jìn)程,就會(huì)帶上這些配置,而且是常駐內(nèi)存的。
opcode是一種思路,accelerate之類的也還可以。只是聽大牛的分享里面講過。http://www.infoq.com/cn/presentations/php-project-control