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