逐步提升php框架的性能
更新時(shí)間:2008年01月10日 20:32:43 作者:
逐步提升php框架的性能
一、當(dāng)前框架存在什么問(wèn)題
目前主流的框架Zend Framework、Cakephp等都采用了MVC模式,同時(shí)實(shí)現(xiàn)了URL的路由分配。比如說(shuō)http://www.xxx.com/user/login就會(huì)映射到userController對(duì)象中的loginAction方法,http://www.xxx.com/user/register對(duì)應(yīng)為userController對(duì)象中的registerAction方法。這樣對(duì)應(yīng)的userController對(duì)象就很可能是這樣的。
<?
class userController extends controller{
function loginAction(){
//login
}
function registerAction(){
}
}
?>
那么這存在什么樣的問(wèn)題呢?很明顯:包含了不必要的代碼!比如說(shuō)你訪問(wèn)/user/login完全沒(méi)必要包含registerAction()方法里面的內(nèi)容。上面的代碼只是簡(jiǎn)單的例子,一般來(lái)說(shuō)controller對(duì)應(yīng)的是一個(gè)小功能模塊,它會(huì)有比較多的功能操作的,尤其在比較大的項(xiàng)目中。這樣,如果一個(gè)controller里面有十幾個(gè)方法,那么每請(qǐng)求就包含了很多冗余的代碼。而在PHP性能提升中很重要的一點(diǎn):盡量避免包含不相關(guān)代碼!
在我最近的小項(xiàng)目中,我采用自己的phpbean框架(框架類似Zend Framework),在后來(lái)的開(kāi)發(fā)發(fā)現(xiàn)的確每個(gè)controller包含太多action了,后來(lái)不得不考慮分流。但很不理想。項(xiàng)目地址:http://www.songjin.net:8080。
二、問(wèn)題不是因?yàn)槊鎸?duì)對(duì)象的錯(cuò)
很多人認(rèn)為“包含多余的冗余代碼是面對(duì)對(duì)象的錯(cuò)誤”,我不同意。正如我上篇說(shuō)的:面對(duì)對(duì)象能實(shí)現(xiàn)面對(duì)過(guò)程的所有功能,并且做的更好!關(guān)鍵是采用面對(duì)對(duì)象的思維來(lái)使用面對(duì)對(duì)象,而不是用面對(duì)過(guò)程的思維來(lái)寫(xiě)面對(duì)對(duì)象的程序。
三、如何解決這個(gè)問(wèn)題呢?
解決的關(guān)鍵就是把a(bǔ)ction分離開(kāi)來(lái)。如何分離呢?首先要清楚controller的作用。controller是控制器,主要是做請(qǐng)求的轉(zhuǎn)發(fā),把http請(qǐng)求轉(zhuǎn)發(fā)到具體的action上。注意:在struts中是沒(méi)有存在controller文件的(注意不是說(shuō)沒(méi)有控制器),它是直接映射到action文件。所以我們完全可以把controller直接放到路由轉(zhuǎn)發(fā)中,而真正的流程控制、邏輯處理等放到action中。
比如說(shuō)上面的例子,我們就可以分離成兩個(gè)文件:
loginAction.php
<?
class loginAction extends Action{
function run(){
}
}
?>
和registerAction.php
<?
class registerAction extends Action{
function run(){
}
}
?>
這樣就實(shí)現(xiàn)了action的分離。當(dāng)你訪問(wèn)/user/login請(qǐng)求的時(shí)候就不會(huì)包含registerAction的代碼。
但這樣又存在兩個(gè)問(wèn)題:
第一、實(shí)際項(xiàng)目中action文件會(huì)非常多,如何有效的管理是個(gè)關(guān)鍵。
第二、同一功能模塊中的操作可能有共同的代碼,如何共享?
第一個(gè)問(wèn)題比較好解決。把同一個(gè)模塊的action放到一個(gè)子文件夾中,也就是說(shuō)允許多級(jí)目錄。比如說(shuō)我們上面的代碼中就可以把loginAction.php和registerAction.php放到user目錄中。但注意這樣會(huì)增加路由分配的麻煩度,如何實(shí)現(xiàn)就看讀者自己去思考了。
第二個(gè)問(wèn)題的解決也不難,關(guān)鍵是具有面向?qū)ο蟮乃季S。這里,我們就可以采用對(duì)象的繼承來(lái)實(shí)現(xiàn)。比如說(shuō)上面的例子,我們可以先定義一個(gè)user抽象類。
<?
class user extends Action(){
function __contruct(){
//比如說(shuō)權(quán)限檢查
}
}
?>
然后讓loginAction 和RegisterAction都繼承與user。這樣就可以很好解決了。
四、總結(jié)
上面的解決方案只是我這幾天的想法,可能還不夠完善。具體應(yīng)用大家可以再細(xì)化并優(yōu)化。對(duì)于MVC、框架我始終認(rèn)為在PHP5中,對(duì)象比過(guò)程更適合,也更有效(除去創(chuàng)建對(duì)象本身的成本)。對(duì)于使用函數(shù)來(lái)實(shí)現(xiàn)框架,前一段在PCTI的講課中我也試過(guò),我覺(jué)得思路都差不多,但相對(duì)來(lái)說(shuō)我更喜歡對(duì)象。
最后,上面的解決方案參考了java中的struts的部分思想。在此表示感謝!
目前主流的框架Zend Framework、Cakephp等都采用了MVC模式,同時(shí)實(shí)現(xiàn)了URL的路由分配。比如說(shuō)http://www.xxx.com/user/login就會(huì)映射到userController對(duì)象中的loginAction方法,http://www.xxx.com/user/register對(duì)應(yīng)為userController對(duì)象中的registerAction方法。這樣對(duì)應(yīng)的userController對(duì)象就很可能是這樣的。
<?
class userController extends controller{
function loginAction(){
//login
}
function registerAction(){
}
}
?>
那么這存在什么樣的問(wèn)題呢?很明顯:包含了不必要的代碼!比如說(shuō)你訪問(wèn)/user/login完全沒(méi)必要包含registerAction()方法里面的內(nèi)容。上面的代碼只是簡(jiǎn)單的例子,一般來(lái)說(shuō)controller對(duì)應(yīng)的是一個(gè)小功能模塊,它會(huì)有比較多的功能操作的,尤其在比較大的項(xiàng)目中。這樣,如果一個(gè)controller里面有十幾個(gè)方法,那么每請(qǐng)求就包含了很多冗余的代碼。而在PHP性能提升中很重要的一點(diǎn):盡量避免包含不相關(guān)代碼!
在我最近的小項(xiàng)目中,我采用自己的phpbean框架(框架類似Zend Framework),在后來(lái)的開(kāi)發(fā)發(fā)現(xiàn)的確每個(gè)controller包含太多action了,后來(lái)不得不考慮分流。但很不理想。項(xiàng)目地址:http://www.songjin.net:8080。
二、問(wèn)題不是因?yàn)槊鎸?duì)對(duì)象的錯(cuò)
很多人認(rèn)為“包含多余的冗余代碼是面對(duì)對(duì)象的錯(cuò)誤”,我不同意。正如我上篇說(shuō)的:面對(duì)對(duì)象能實(shí)現(xiàn)面對(duì)過(guò)程的所有功能,并且做的更好!關(guān)鍵是采用面對(duì)對(duì)象的思維來(lái)使用面對(duì)對(duì)象,而不是用面對(duì)過(guò)程的思維來(lái)寫(xiě)面對(duì)對(duì)象的程序。
三、如何解決這個(gè)問(wèn)題呢?
解決的關(guān)鍵就是把a(bǔ)ction分離開(kāi)來(lái)。如何分離呢?首先要清楚controller的作用。controller是控制器,主要是做請(qǐng)求的轉(zhuǎn)發(fā),把http請(qǐng)求轉(zhuǎn)發(fā)到具體的action上。注意:在struts中是沒(méi)有存在controller文件的(注意不是說(shuō)沒(méi)有控制器),它是直接映射到action文件。所以我們完全可以把controller直接放到路由轉(zhuǎn)發(fā)中,而真正的流程控制、邏輯處理等放到action中。
比如說(shuō)上面的例子,我們就可以分離成兩個(gè)文件:
loginAction.php
<?
class loginAction extends Action{
function run(){
}
}
?>
和registerAction.php
<?
class registerAction extends Action{
function run(){
}
}
?>
這樣就實(shí)現(xiàn)了action的分離。當(dāng)你訪問(wèn)/user/login請(qǐng)求的時(shí)候就不會(huì)包含registerAction的代碼。
但這樣又存在兩個(gè)問(wèn)題:
第一、實(shí)際項(xiàng)目中action文件會(huì)非常多,如何有效的管理是個(gè)關(guān)鍵。
第二、同一功能模塊中的操作可能有共同的代碼,如何共享?
第一個(gè)問(wèn)題比較好解決。把同一個(gè)模塊的action放到一個(gè)子文件夾中,也就是說(shuō)允許多級(jí)目錄。比如說(shuō)我們上面的代碼中就可以把loginAction.php和registerAction.php放到user目錄中。但注意這樣會(huì)增加路由分配的麻煩度,如何實(shí)現(xiàn)就看讀者自己去思考了。
第二個(gè)問(wèn)題的解決也不難,關(guān)鍵是具有面向?qū)ο蟮乃季S。這里,我們就可以采用對(duì)象的繼承來(lái)實(shí)現(xiàn)。比如說(shuō)上面的例子,我們可以先定義一個(gè)user抽象類。
<?
class user extends Action(){
function __contruct(){
//比如說(shuō)權(quán)限檢查
}
}
?>
然后讓loginAction 和RegisterAction都繼承與user。這樣就可以很好解決了。
四、總結(jié)
上面的解決方案只是我這幾天的想法,可能還不夠完善。具體應(yīng)用大家可以再細(xì)化并優(yōu)化。對(duì)于MVC、框架我始終認(rèn)為在PHP5中,對(duì)象比過(guò)程更適合,也更有效(除去創(chuàng)建對(duì)象本身的成本)。對(duì)于使用函數(shù)來(lái)實(shí)現(xiàn)框架,前一段在PCTI的講課中我也試過(guò),我覺(jué)得思路都差不多,但相對(duì)來(lái)說(shuō)我更喜歡對(duì)象。
最后,上面的解決方案參考了java中的struts的部分思想。在此表示感謝!
您可能感興趣的文章:
- 深入理解PHP中的static和yield關(guān)鍵字
- PHP yield關(guān)鍵字功能與用法分析
- PHP5.5新特性之yield理解與用法實(shí)例分析
- php和C#的yield迭代器實(shí)現(xiàn)方法對(duì)比分析
- 分享五個(gè)PHP7性能優(yōu)化提升技巧
- PHP開(kāi)啟opcache提升代碼性能
- PHP 7安裝使用體驗(yàn)之性能大提升,兼容性強(qiáng),擴(kuò)展支持不夠(升級(jí)PHP要謹(jǐn)慎)
- 提高PHP編程效率 引入緩存機(jī)制提升性能
- 提升PHP性能的21種方法介紹
- 使用Huagepage和PGO來(lái)提升PHP7的執(zhí)行性能
- php使用yield對(duì)性能提升的測(cè)試實(shí)例分析
相關(guān)文章
PHP Laravel軟刪除的實(shí)現(xiàn)方法介紹
軟刪除就是邏輯刪除,數(shù)據(jù)保留單標(biāo)記上刪除狀態(tài),一般我們會(huì)用刪除時(shí)間來(lái)作為標(biāo)記,這樣標(biāo)記狀態(tài)有了,刪除時(shí)間也有了2022-09-09
php實(shí)現(xiàn)的仿阿里巴巴實(shí)現(xiàn)同類產(chǎn)品翻頁(yè)
當(dāng)前頁(yè)左邊的頁(yè)碼為最新的產(chǎn)品,按更新時(shí)間呈升序排列;右邊的頁(yè)碼為早期的產(chǎn)品, 按更新時(shí)間呈降序排列。2009-12-12
Yii框架實(shí)現(xiàn)樂(lè)觀鎖與悲觀鎖流程詳解
樂(lè)觀鎖(optimistic locking)表現(xiàn)出大膽、務(wù)實(shí)的態(tài)度。使用樂(lè)觀鎖的前提是, 實(shí)際應(yīng)用當(dāng)中,發(fā)生沖突的概率比較低。他的設(shè)計(jì)和實(shí)現(xiàn)直接而簡(jiǎn)潔。 目前Web應(yīng)用中,樂(lè)觀鎖的使用占有絕對(duì)優(yōu)勢(shì)。悲觀鎖正如其名字,悲觀鎖(pessimistic locking)體現(xiàn)了一種謹(jǐn)慎的處事態(tài)度2022-11-11
解析獲取優(yōu)酷視頻真實(shí)下載地址的PHP源代碼
本篇文章是對(duì)獲取優(yōu)酷視頻真實(shí)下載地址的PHP源代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
WordPress的文章自動(dòng)添加關(guān)鍵詞及關(guān)鍵詞的SEO優(yōu)化
這篇文章主要介紹了給WordPress的文章添加關(guān)鍵詞及關(guān)鍵詞的SEO優(yōu)化方法,突出關(guān)鍵詞在搜尋結(jié)果中的作用,需要的朋友可以參考下2016-03-03
php的無(wú)刷新操作實(shí)現(xiàn)方法分析
這篇文章主要介紹了php的無(wú)刷新操作實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了PHP無(wú)刷新操作常見(jiàn)原理、實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2020-02-02

