逐步提升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 IF ELSE简化/三元一次式的使用
Aug 22 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
May 15 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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 json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
php支付宝接口用法分析
2015/01/04 PHP
php编程每天必学之表单验证
2016/03/01 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
最短的IE判断代码
2011/03/13 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
JavaScript实现二叉树定义、遍历及查找的方法详解
2017/12/20 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队Mineski晋级之路
2018/04/07 DOTA
python 查找文件名包含指定字符串的方法
2018/06/05 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
食品行业求职人的自我评价
2014/01/19 职场文书
施工质量承诺书范文
2014/05/30 职场文书
组织鉴定材料
2014/06/02 职场文书
关于学习的决心书
2015/02/05 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
幽默导游词开场白
2015/05/29 职场文书
小学毕业感言200字
2015/07/30 职场文书
详解Redis复制原理
2021/06/04 Redis