这个图是ZF文档中的,7.2节的图。由于中文文档还没有翻译,所以先搞个图看看,这个图画的非常好,非常明朗。
我已经用不同的颜色标注了不同的部分。主要流程是绿色块,黄色部分是钩子,这种蓝色代表Request和Response对象,紫红色部分判断是否dispath完毕。基本方向就是:Request -> Router -> Dispatch -> Send Response
更新:

更详细的说明请参看http://gonefish.cn/?page_id=473
今天在找ZendFramework资料的时候找到了一个网站,用apache branchmark对四个框架进行了测试。分别是:
结果是Solar每秒中处理请求最多,Zend Framework次之,后面则跟着Cake,Symfony。
| ramework |
avg |
rel |
| solar-0.25.0 |
170.26 |
3.24 |
| zend-0.6.0 |
131.91 |
2.51 |
| cake-1.1.12 |
114.39 |
2.18 |
| symfony-1.0.0beta2 |
67.18 |
1.28 |
由于该ZF版本是0.6版,而马上0.9版也就要发布,所以上面结果可参考一下。而且,作者在这些测试代码放在google code中,有兴趣可以自己下下来测试一下。solar这个框架我也是今天才看到,有点像ZF,不过具体代码就没看了,也是PHP5专用的。
New Year’s Benchmarks
原来这篇Weblog的作者就是Solar的开发者。
在MVC的结构中,都会有一些URL的映射机制,他可以让你写出漂亮的URL,友好的URL是SEO中重要的一部分。在使用ZF的时候,如果对URL没有太多要求,可以使用默认约定的URL规则,这样做是最快的。如果你想使用漂亮的URL,不管你用什么Route,都不要一次性添加许多Route。因为在ZF中,所有的自定Route都会添加到一个数组中,而且,每次都会遍历数组来匹配你请求请求的URL对应哪一个Route。如果你的规则越多,那么效率就会越低,那是当然的。所以,最好添加Route前,判断一下URL,再来添加某一个Route。
以上我看ZF的源代码后的结果,不过还没有做的测试,可能出现不服的情况。
这段时间主要在改数据库方面的东西,于是有时间对Zend_Db进行了解。
Zend_Db是最低层的封装,通过不同的适配器,来实现不同数据库和不同数据库接口之间的差别。现在最主要的使用pdo_mysql这个适配器,Mysqli也许也是个不错的选择。这个接口的数据库操作是需要自己写sql语句的,但还是提供了一些简单的功能封装。至于Oracle和Db2我就没试过了。
Zend_Db_Table是一个“表模式”,这种模式你能用面向对像的方式来操作数据库。在创建实现的时间,会要求你添加了个Zend_Db实例,因为所有的数据操作还是通过Zend_Db来完成的。
Zend_Db_Table_Row你可以把它看到是一条记录,当然是通过Zend_Db_Table里的某些方法创建的,让你操作对象一样修改某一种记录。但这里还是包装,Zend_Db_Table_Row的方法找Zend_Db_Table,结果Zend_Db_Table又去找Zend_Db。
Zend_Db_Table_Rowset是一个Zend_Db_Table_Row的迭代器。
我已经好久一段时间没有写PHP的程序,这个小网站的程序也停了下来。一些工作转到了Django。最近去看1.1的Roadmap的时候,发现1.1将是一个非常重大的更新,LDAP在大型网站中是非常有用的服务,做为“企业级”的框架有些东西还是必要的。Zend_Cache方面看来也得到了强化。
ZF-2117 Code Generation Tool
这个看来是非常必要的,DRY,是个好东西
ZF-2116 View Layouts
已前在Zend_View与控制器结合不是非常紧密,现在通过Layouts技术来结合。总之1.1是个非常重要的版本。另外PDT也已经发布1.0的版本了,最近被eclipse的强大所感动了。
在Zend Framework1.7中的Zend_Loader包中,加入了一个优化读取helper类的机制。只需要简单设置一下Zend_Loader_PluginLoader就可以达到效果。
Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);
$classFileIncCache指向一个过写的空白PHP文件,当有helper之类的文件需要加载时,会自动写入到$classFileIncCache文件中,以include_once的形式加载,在之后就会默认自动加载程序中用到的文件了。在许多的组件的读取helper过程中,已经判断了是否设置了$classFileIncCache,如果设置了就会写进这个文件,如果没有设置就是直接读取了。
关于自定的View_Helper可以设置Zend_Loader_PluginLoader的插件读取目录,具体可参考官方文档。
在开发Web站点的时候,经常会碰到提供子域名的服务之类的问题,而在Zend Framework的开发过程中,所有的链接都会被重写到index.php上。这样在实现子域名的开发上就有些麻烦,但在Zend Framework 1.7中,在一个新的路由器专门用来处理子域名的映射,Zend_Controller_Router_Route_Hostname。她的工作原理是这样的:
首页通过Zend_Controller_Router_Route_Hostname规则找到相对应的域名,根据域名你可以产生相关变量,如:控制器名称;用户ID等。这找到相对应的规则后,再对路径进行了路由规则进行匹配。就是说通过两次路由规则找到相对应的参数
假如有这样一个地址,gonefish.users.example.com/profile。创建如下规则:
$hostnameRoute = new Zend_Controller_Router_Route_Hostname(
‘:username.users.example.com’,
array(
‘controller’ => ’profile’,
‘action’ => ’userinfo’
)
);
$plainPathRoute = new Zend_Controller_Router_Route_Static(”);
$plainPathRoute2 = new Zend_Controller_Router_Route(
‘profile’,
array(
‘action’ => ’profile’
),
);
$router->addRoute(‘user’, $hostnameRoute->chain($plainPathRoute);
$router->addRoute(‘user’, $hostnameRoute->chain($plainPathRoute2);
第一种情况:访问gonefish.users.example.com。首先,路由系统先匹配gonefish.users.example.com域名,找到了控制名和动作名;然后再对后面的路径进行一次规则匹配,因为没有其它路径了,所以应用的是$plainPathRoute1路由规则。
第二种情况:访问gonefish.users.example.com/profile。首先,路由系统先匹配gonefish.users.example.com域名,找到了控制名和动作名;然后再对路径profile进行一次规则匹配,这样更新了动作名,即$plainPathRoute2的路由规则。
通过对访问地址进行两次路由规则的匹配来映射最终访问的方法。