Zend Framework是Zend 官方用PHP写的一套MVC框架,里面包含了诸多组件,可以单独使用,但是在PHP的MVC框架中的性能评测中总是处于下风。在之前的项目中有使用过Zend Framework,对于结构和代码的规范有比较好的帮助,类库也非常全面,所以想在其他的一些项目中也能够应用到Zend Framework的一些Library。Yaf是国内牛人仿Zend Framework开发的一个PHP MVC框架的C扩展,性能较Zend Framework有巨大的提升,但是不如Zend Framework全面,更侧重于前端控制,大概后端用其方法来做更好。Yaf的文档少了些,而Zend Framework的应用则比较多,社区支持也更广泛。所以在新的项目采用了Yaf做为前端的分发管理器,结合Zend Framework的类库来进行开发。
本文是关于Zend_Log中添加Zend_Log_Writer_Firebug无效,不能输出到firebug的解决方法。其实这个问题刚好在其他项目中应用的时候也有碰到,之后在stackoverflow上找到了答案,原来是这个功能还依赖于Zend_Wildfire_Channel_HttpHeaders,又需要Zend_Controller_Request_Http和Zend_Controller_Response_Http。于是就仿着写了一个Yaf扩展,代码如下:
<?php
/**
* Ap定义了如下的7个Hook,
* 插件之间的执行顺序是先进先Call
*/
class WildfireChannelPlugin extends Yaf_Plugin_Abstract {
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
$this->_request = new Zend_Controller_Request_Http();
$this->_response = new Zend_Controller_Response_Http();
$this->_channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
$this->_channel->setRequest($this->_request);
$this->_channel->setResponse($this->_response);
ob_start();
}
public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
if(isset($this->_channel)){
$this->_channel->flush();
$this->_response->sendHeaders();
}
}
}
然后在Bootstrap.php中注册扩展,代码如下:
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
if(Yaf_Registry::get("config")->get("log")->get("firebug")){
$WildfireChannel = new WildfireChannelPlugin();
$dispatcher->registerPlugin($WildfireChannel);
}
}
之后,Zend_Log_Writer_Firebug和firebug就可以正常工作了。如果要在其他项目中应用,只需要在开始输出前和输出结束后,分别调用上面连个方法就可以了,比如在启动文件中:
class Boot{
protected $_request;
protected $_response;
protected $_channel;
protected function _initWildfireChannel(){
$this->_request = new Zend_Controller_Request_Http();
$this->_response = new Zend_Controller_Response_Http();
$this->_channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
$this->_channel->setRequest($this->_request);
$this->_channel->setResponse($this->_response);
ob_start();
}
public function __destruct(){
if(isset($this->_channel)){
$this->_channel->flush();
$this->_response->sendHeaders();
}
}
}
然后按需打开WildfireChannel就可以了。
参考链接:
Zend_Log_Writer_Firebug() not working
高性能PHP框架 Phalcon
Zend Framework