逐步提升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 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
PHP 类商品秒杀计时实现代码
May 05 PHP
在PHP上显示JFreechart画的统计图方法
Nov 03 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
PHP学习笔记(二):变量详解
Apr 17 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
Zend Framework分发器用法示例
Dec 11 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 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开启opcache提升代码性能
2015/04/26 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
php curl常用的5个经典例子
2017/01/20 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
JavaScript使用concat连接数组的方法
2015/04/06 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
初学Python函数的笔记整理
2015/04/07 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
初一学生评语大全
2014/04/24 职场文书
地理科学专业自荐信
2014/09/01 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android