全部博文(155)
分类:
2010-05-17 17:25:46
fgetcsv()解析CSV文件,并转化为PHP的原生格式。parse_ini_file()解析INI文件,并转化为PHP的原生格式。它的性能和CSV差不多。Zend_Translate和Zend_Locale都实现了缓存功能,它可以明显地提升性能。通常情况下,性能瓶颈在于读入文件,而不是实际的查找操作,使用缓存可以避免翻译和本地化文件的重复读取。Zend_View组件。相对于其它视图或模板引擎,Zend_View是相当高效的。因为直接用PHP编写视图脚本,就没有编译自定义标记的负担,也不需要担心编译后脚本的优化。当然, Zend_View也存在自己的问题:扩展的代价很大(视图助手),如果通过许多视图助手来完成关键功能,将会导致很大的性能开销。
Zend_View中的大部分方法实际上都是通过助手系统的重载来实现的。它赋予Zend_View极大的灵活性,不需要扩展Zend_View,提供应用所需的助手方法就可以,开发者在单独的类中定义助手方法,然后就可以像调用定义在Zend_View中的方法那样使用助手方法。这样既可以保持视图对象的简单性,也可以保证助手只在需要时被创建。Zend_View通过插件载入器查找助手类文件。这意味着每一次调用助手,Zend_View需要把助手名字传给插件载入器,由它决定类名,如果未载入则载入助手,然后返回实例化的对象。因为Zend_View在内部缓存了已经加载的助手,所以下次再使用这个助手时,速度将会快很多,然而,如果应用中使用了很多助手,这个过程对系统性能的影响可能会很大。Zend_View,在子类中手动增加应用常用的助手方法。这些助手方法可以简单地作为一个代理,实例化一个相应助手类完成任务,当然也可以自己实现任务的所有操作。class My_View extends Zend_View
{ /** * @var array Registry of helper classes used */ protected $_localHelperObjects = array(); /** * Proxy to url view helper * * @param array $urlOptions Options passed to the assemble method of the Route object. * @param mixed $name The name of a Route to use. If null it will use the current Route * @param bool $reset Whether or not to reset the route defaults with those provided * @return string Url for the link href attribute. */ public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true ) { if (!array_key_exists('url', $this->_localHelperObjects)) { $this->_localHelperObjects['url'] = new Zend_View_Helper_Url(); $this->_localHelperObjects['url']->setView($view); } $helper = $this->_localHelperObjects['url']; return $helper->url($urlOptions, $name, $reset, $encode); } /** * Echo a message * * Direct implementation. * * @param string $string * @return string */ public function message($string) { return "" . $this->escape($message) . "
n"; }}
partial() 视图助手会因为克隆视图对象而产生性能瓶颈。有办法提高它的速度吗?partial()视图助手接收三个参数:$name: 视图脚本的名字$module: 视图脚本所在的模块名,或者当没有第三个参数且是一个对象或数组时,它将作为$model参数。$model: 数组或对象,作为干净的数据赋值给视图,用于解析区域视图。partial()的强大之处在于第二与第三个参数。$module参数允许临时加入指定模块的视图路径,从而解析该模块下的区域视图脚本;$model参数允许你显式地为区域视图指定变量。如果你根本没有用到这两个参数,那么请用render()代替!partial()。相反,你应该使用Zend_View内置的render()方法渲染视图。
action()视图助手,允许开发者分发一个MVC动作并捕获它的输出。它向DRY原则迈近了一大步,促进了代码的复用。但是这也是一个代价高昂的操作。在action()视图助手内部,它会克隆请求和响应对象,调用分发器,然后调用对应的控制器和动作等等。action()视图助手同时加入ZF的,由一个动作助手和前端控制器插件组成。它允许你将分发周期中需要调用的附加动作压入一个栈中。如果你在布局视图脚本中使用了action(),它可以用动作堆栈替换,完成视图的渲染,实现响应片段的分离。作为例子,你可以像下面那样实现一个dispatchLoopStartup() 插件,为每个页面添加一个登录表单输入框:class LoginPlugin extends Zend_Controller_Plugin_Abstract
{ protected $_stack; public function dispatchLoopStartup( Zend_Controller_Request_Abstract $request ) { $stack = $this->getStack(); $loginRequest = new Zend_Controller_Request_Simple(); $loginRequest->setControllerName('user') ->setActionName('index') ->setParam('responseSegment', 'login'); $stack->pushStack($loginRequest); } public function getStack() { if (null === $this->_stack) { $front = Zend_Controller_Front::getInstance(); if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) { $stack = new Zend_Controller_Plugin_ActionStack(); $front->registerPlugin($stack); } else { $stack = $front->getPlugin('ActionStack') } $this->_stack = $stack; } return $this->_stack; }}
然后UserController::indexAction()方法就可以通过responseSegment参数指定渲染哪个响应片段。在布局脚本中,你可以简单地输出该响应片段:= $this->layout()->login ?>
action()视图助手效率要高,因为它不需要克隆对象及重置它们的状态。此外,它可以确保所有的pre/post分发插件会被调用,如果你是通过前端控制器插件实现ACL,那么这一点就显得特别重要。action()是小题大做。如果大部分的业务逻辑都封装在模型中,而你只是简单地查询模型,并将结果传递给视图脚本的话,通过一个视图助手获取模型,查询数据,完成相应的操作,将是一个更高效简洁的方法。class BugController extends Zend_Controller_Action
{ public function listAction() { $model = new Bug(); $this->view->bugs = $model->fetchActive(); }}
// bug/list.phtml:
echo "
foreach ($this->bugs as $bug) { printf("%s: %sn", $this->escape($bug->id), $this->escape($bug->summary)); }
echo "
action(),将像下面这样调用:= $this->action('list', 'bug') ?>class My_View_Helper_BugList extends Zend_View_Helper_Abstract
{ public function direct() { $model = new Bug(); $html = "n";
foreach ($model->fetchActive() as $bug) { $html .= sprintf( "%s: %sn", $this->view->escape($bug->id), $this->view->escape($bug->summary) ); } $html .= "
n"; return $html; }}
= $this->bugList() ?>
action()助手的开销,并且该API更易于理解。