逐步提升php架構的效能

來源:互聯網
上載者:User

一、當前架構存在什麼問題

目前主流的架構Zend Framework、Cakephp等都採用了MVC模式,同時實現了URL的路由分配。比如說http://www.xxx.com/user/login就會映射到userController對象中的loginAction方法,http://www.xxx.com/user/register對應為userController對象中的registerAction方法。這樣對應的userController對象就很可能是這樣的。

<?
class userController extends controller{

function loginAction(){
//login
}

function registerAction(){

}
}
?>

那麼這存在什麼樣的問題呢?很明顯:包含了不必要的代碼!比如說你訪問/user/login完全沒必要包含registerAction()方法裡面的內容。上面的代碼只是簡單的例子,一般來說controller對應的是一個小功能模組,它會有比較多的功能操作的,尤其在比較大的項目中。這樣,如果一個controller裡面有十幾個方法,那麼每請求就包含了很多冗餘的代碼。而在PHP效能提升中很重要的一點:盡量避免包含不相關代碼!
在我最近的小項目中,我採用自己的phpbean架構(架構類似Zend Framework),在後來的開發發現的確每個controller包含太多action了,後來不得不考慮分流。但很不理想。項目地址:http://www.songjin.net:8080。

二、問題不是因為面對對象的錯
很多人認為“包含多餘的冗餘代碼是面對對象的錯誤”,我不同意。正如我上篇說的:面對對象能實現面對過程的所有功能,並且做的更好!關鍵是採用面對對象的思維來使用面對對象,而不是用面對過程的思維來寫面對對象的程式。

三、如何解決這個問題呢?
解決的關鍵就是把action分離開來。如何分離呢?首先要清楚controller的作用。controller是控制器,主要是做請求的轉寄,把http請求轉寄到具體的action上。注意:在struts中是沒有存在controller檔案的(注意不是說沒有控制器),它是直接映射到action檔案。所以我們完全可以把controller直接放到路由轉寄中,而真正的流程式控制制、邏輯處理等放到action中。
比如說上面的例子,我們就可以分離成兩個檔案:
loginAction.php

<?
class loginAction extends Action{

function run(){

}

}
?>

和registerAction.php

<?
class registerAction extends Action{

function run(){

}

}
?>

這樣就實現了action的分離。當你訪問/user/login請求的時候就不會包含registerAction的代碼。
但這樣又存在兩個問題:
第一、實際項目中action檔案會非常多,如何有效管理是個關鍵。
第二、同一功能模組中的操作可能有共同的代碼,如何共用?

第一個問題比較好解決。把同一個模組的action放到一個子檔案夾中,也就是說允許多級目錄。比如說我們上面的代碼中就可以把loginAction.php和registerAction.php放到user目錄中。但注意這樣會增加路由分配的麻煩度,如何?就看讀者自己去思考了。

第二個問題的解決也不難,關鍵是具有物件導向的思維。這裡,我們就可以採用對象的繼承來實現。比如說上面的例子,我們可以先定義一個user抽象類別。

<?
class user extends Action(){

function __contruct(){
//比如說許可權檢查
}
}
?>

然後讓loginAction 和RegisterAction都繼承與user。這樣就可以很好解決了。

四、總結
上面的解決方案只是我這幾天的想法,可能還不夠完善。具體應用大家可以再細化並最佳化。對於MVC、架構我始終認為在PHP5中,對象比過程更適合,也更有效(除去建立對象本身的成本)。對於使用函數來實現架構,前一段在PCTI的講課中我也試過,我覺得思路都差不多,但相對來說我更喜歡對象。
最後,上面的解決方案參考了java中的struts的部分思想。在此表示感謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.