逐步提升php框架的性能

 更新时间:2008年01月10日 20:32:43   作者:  
逐步提升php框架的性能
一、当前框架存在什么问题

     目前主流的框架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数组保存文本与文本反编成数组实例

    这篇文章主要介绍了php数组保存文本与文本反编成数组的方法,通过两个自定义函数string2array与array2string实例展示了php数组保存文本与文本反编成数组的实现方法,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • PHP通过调用新浪API生成t.cn格式短网址链接的方法详解

    PHP通过调用新浪API生成t.cn格式短网址链接的方法详解

    这篇文章主要介绍了PHP通过调用新浪API生成t.cn格式短网址链接的方法,结合实例形式较为详细的分析了php调用新浪API生成t.cn格式短网址链接的具体操作步骤与相关注意事项,需要的朋友可以参考下
    2019-02-02
  • php闭包中使用use声明变量的作用域实例分析

    php闭包中使用use声明变量的作用域实例分析

    这篇文章主要介绍了php闭包中使用use声明变量的作用域,结合实例形式分析了闭包中use声明变量作用域的相关原理与分析,需要的朋友可以参考下
    2018-08-08
  • PHP实现预定义钩子和自定义钩子的简单示例

    PHP实现预定义钩子和自定义钩子的简单示例

    这篇文章主要给大家介绍了PHP实现预定义钩子和自定义钩子,在PHP中,钩子(Hooks)是一种机制,允许开发人员在特定的时机插入自定义代码,通过使用钩子,开发人员可以在应用程序的特定事件发生时执行自定义的功能或逻辑,文中有详细的代码讲解,需要的朋友可以参考下
    2023-11-11
  • PHP实现生成二维码的示例代码

    PHP实现生成二维码的示例代码

    为了满足用户渠道推广分析和用户账号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。本文将利用这些接口实现生成临时二维码和永久二维码,需要的可以参考一下
    2022-05-05
  • php通过header增加Key、Sign和Timestamp实现鉴权机制的流程步骤

    php通过header增加Key、Sign和Timestamp实现鉴权机制的流程步骤

    在现代Web应用程序中,鉴权是确保只有合法用户能够访问资源的关键部分,在PHP中,你可以通过在HTTP请求的Header中添加Key、Sign和Timestamp来实现鉴权机制,需要的朋友可以参考下
    2023-10-10
  • PHP设计模式之模板模式定义与用法详解

    PHP设计模式之模板模式定义与用法详解

    这篇文章主要介绍了PHP设计模式之模板模式定义与用法,较为详细的说明了模板模式的原理、功能、应用及php定义、使用模板模式的相关操作技巧,代码简单易懂,需要的朋友可以参考下
    2018-12-12
  • php 连接mysql连接被重置的解决方法

    php 连接mysql连接被重置的解决方法

    windows7下 php连接mysql的问题,php 连接mysql连接被重置的解决方法,需要的朋友可以参考下。
    2011-02-02
  • php使用exec shell命令注入的方法讲解

    php使用exec shell命令注入的方法讲解

    exec()是用于执行shell命令的函数,下面说的就是如何使用他用于shell注入的方法讲解
    2013-11-11
  • php下批量挂马和批量清马代码

    php下批量挂马和批量清马代码

    批量挂马和批量清马程序PHP版,所以黑客工具的对立性,在黑客手里是破坏工具,在维护的站长来说是修正工具。
    2011-02-02

最新评论