逐步提升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者的疑难问答(2)
Oct 09 PHP
php数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
php中global和$GLOBALS[]的分析之一
Feb 02 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
深入apache配置文件httpd.conf的部分参数说明
Jun 28 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
PHP+swoole实现简单多人在线聊天群发
Jan 19 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
PHP用户注册邮件激活账户的实现代码
May 31 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 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
如何选购合适的收音机
2021/03/01 无线电
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
xmlHTTP实例
2006/10/24 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
2017/05/19 jQuery
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
pygame实现简易飞机大战
2018/09/11 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
python多线程实现TCP服务端
2019/09/03 Python
python中最小二乘法详细讲解
2021/02/19 Python
Why we need EJB
2016/10/20 面试题
八年级音乐教学反思
2014/01/09 职场文书
创意活动策划书
2014/01/15 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
围城读书笔记
2015/06/26 职场文书
团拜会主持词
2015/07/04 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL
LeetCode189轮转数组python示例
2022/08/05 Python