当前位置: 首页 > 图文教程 > 网络编程 > PHP > 逐步提升php框架的性能

PHP
php,不用COM,生成excel文件
无限级别菜单的实现
如何过滤高亮显示非法字符
PHP实现的功能是显示8条基色色带
PHP模拟SQL Server的两个日期处理函数
用PHP连接Oracle数据库
PHP 和 MySQL 开发的 8 个技巧
PHP4在WinXP下IIS和Apache2服务器上的安装实例
如何对PHP程序中的常见漏洞进行攻击(上)
桌面中心(三)修改数据库
桌面中心(二)数据库写入
桌面中心(一)创建数据库
桌面中心(四)数据显示
玩转虚拟域名◎+ .
如何分别全角和半角以避免乱码
如何去掉文章里的 html 语法
PHP 增加了对 .ZIP 文件的读取功能
配置PHP使之能同时支持GIF和JPEG
使用php+xslt在windows平台上
图象函数中的中文显示

PHP 中的 逐步提升php框架的性能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 270 ::
收藏到网摘: n/a

一、当前框架存在什么问题
目前主流的框架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的部分思想。在此表示感谢!