45IT.COM- 电脑学习从此开始!
DIY硬件教程攒机经验装机配置
设计Photoshop网页设计特效
系统注册表DOS系统命令其它
存储主板显卡外设键鼠内存
维修显卡CPU内存打印机
WinXPVistaWin7unix/linux
CPU光驱电源/散热显示器其它
修技主板硬盘键鼠显示器光驱
办公ExcelWordPowerPointWPS
编程数据库CSS脚本PHP
网络局域网QQ服务器
软件网络系统图像安全
页面导航: 首页 > 设计学院 > 网络编程 > PHP教程 >

逐步提升php框架的性能

电脑软硬件应用网 45IT.COM 时间:2011-01-05 13:08 作者:网络收集

一、当前框架存在什么问题

  目前主流的框架Zend Framework、Cakephp等都采用了MVC模式,同时实现了URL的路由分配。比如说

http://www.45its.com/user/login就会映射到userController对象中的loginAction方法,http://www.45its.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了,后来不得不考虑分流。但很不理想。

  二、问题不是因为面对对象的错

  很多人认为“包含多余的冗余代码是面对对象的错误”,我不同意。正如我上篇说的:面对对象能实现面对过程的所有功能,

并且做的更好!关键是采用面对对象的思维来使用面对对象,而不是用面对过程的思维来写面对对象的程序。

  三、如何解决这个问题呢?

  解决的关键就是把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的部分思想。在此表示感谢

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: baidushare.htm
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
推荐知识