逐步提升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 相关文章推荐
笑谈配置,使用Smarty技术
Jan 04 PHP
php 代码优化之经典示例
Mar 24 PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 PHP
dedecms中使用php语句指南
Nov 13 PHP
php批量删除超链接的实现方法
Oct 19 PHP
php生成验证码函数
Oct 20 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
PHP时间类完整实例(非常实用)
Dec 25 PHP
php 静态属性和静态方法区别详解
Apr 09 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
其他功能
2006/10/09 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
分享php分页的功能模块
2015/06/16 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
如何重置vue打印变量的显示方式
2017/12/06 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
linux 下实现python多版本安装实践
2014/11/18 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python使用sorted排序的方法小结
2017/07/28 Python
vscode 远程调试python的方法
2017/12/01 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
python实现对象列表根据某个属性排序的方法详解
2019/06/11 Python
Python 如何提高元组的可读性
2019/08/26 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
城管大队整治方案
2014/05/06 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
六查六看六改心得体会
2014/10/14 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL