逐步提升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中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
php去掉字符串的最后一个字符附substr()的用法
Mar 23 PHP
php 文章调用类代码
Aug 11 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
php简单日历函数
Oct 28 PHP
PHP语法小结之基础和变量
Nov 22 PHP
PHP页面间传递值和保持值的方法
Aug 24 PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
Laravel框架路由管理简单示例
May 07 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
JavaScript this调用规则说明
2010/03/08 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
python 基础教程之Map使用方法
2017/01/17 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
python多线程之事件Event的使用详解
2018/04/27 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
django 模版关闭转义方式
2020/05/14 Python
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
党员评议思想汇报
2014/10/08 职场文书
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
MySQL分区表管理命令汇总
2022/03/21 MySQL
基于docker安装zabbix的详细教程
2022/06/05 Servers