逐步提升php框架的性能


Posted in PHP onJanuary 10, 2008

一、当前框架存在什么问题

     目前主流的框架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的部分思想。在此表示感谢!

PHP 相关文章推荐
php遍历目录输出目录及其下的所有文件示例
Jan 27 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
Jun 27 PHP
PHP获取表单所有复选框的值的方法
Aug 28 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
php使用timthumb生成缩略图的方法
Jan 22 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
php实现微信发红包功能
Jul 13 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
thinkphp框架类库扩展操作示例
Nov 26 PHP
PHP实现简单注册登录系统
Dec 28 PHP
在PHP中使用Sockets 从Usenet中获取文件
Jan 10 #PHP
php扩展ZF――Validate扩展
Jan 10 #PHP
set_include_path在win和linux下的区别
Jan 10 #PHP
php模板之Phpbean的目录结构
Jan 10 #PHP
Phpbean路由转发的php代码
Jan 10 #PHP
php框架Phpbean说明
Jan 10 #PHP
深入解析php模板技术原理【一】
Jan 10 #PHP
You might like
PHP新手上路(九)
2006/10/09 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
PHP中echo和print的区别
2014/08/28 PHP
Javascript Select操作大集合
2009/05/26 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
原生javascript中this几种常见用法总结
2020/02/24 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
js实现轮播图特效
2020/05/28 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
python中遍历文件的3个方法
2014/09/02 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
python 实现两个线程交替执行
2020/05/02 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
遇到的Mysql的面试题
2014/06/29 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
教师个人读书活动总结
2014/07/08 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
公司更名通知函
2015/04/24 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书