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