优化Zend框架路由

时间:2012-04-09 08:17:42

标签: php zend-framework optimization routes zend-route

我正在使用使用Zend tool生成的传统Zend框架应用程序。我的应用程序中有几个模块也是使用Zend tool生成的。我打算在我的应用程序中使用Zend框架中的default routes

例如:www.host.com/module/controller/action/param1/value1/param2/value2

以下是我的问题:

  1. 性能方面,使用默认路由是最快的解决方案,对吗?
  2. 由于我不会改变路线,有没有办法让路线改变 路由过程更快?缓存例如?跳过路由 过程完全?或任何其他技术?
  3. 制作自定义路线的优点是什么?对SEO更好吗?
  4. 我可以跳过AJAX调用的路由过程吗? (我知道答案 主要是NO,但也许我可以进一步优化我的调用以进行AJAX调用)
  5. 注意:

    我理解路由过程本身及其在Zend中的工作原理 框架。但是,因为我不能使用大部分功能 我想也许是时候进行微调了。)

    提前致谢。

3 个答案:

答案 0 :(得分:3)

  

1。性能方面,使用默认路由是最快的解决方案,对吗?

是的,但没有使用任何路由系统是最快的解决方案(显然)。

  

2。由于我不会改变路线,有没有办法让路由过程更快?缓存例如?跳过路由   过程完全?或任何其他技术?

嗯,就是这样,路线主要用于灵活性,国际化,SEO。

Zend Framework路由器的问题在于它依赖并包装Front Controller实例,因此缓存路由器很难(很不可能),因为FC本身包装了其他不可缓存的PDO实例。< / p>

因此,对于每个请求,所有路由都会反复计算。

在避免路由计算时使用复杂路由的一种可能解决方案是将所有路由转储到本机Apache重写规则,与ZF相比它会非常快,此解决方案的主要问题是您需要手动计算反向路由和无论何时对路线进行更改,您都需要手动编辑。

通常,它是可扩展性与性能

  

3。制作自定义路线的优点是什么?对SEO更好吗?

嗯,它“取决于”(tm):

/list?type=products vs /products,第二条路线获胜。

然而,/products/page/1 vs /products?page=1是双赢的(实际上它不是,但它是另一个故事)。

其他优点:

  • I18N
  • SEO
  • 可用性
  • 有意义的网址
  

4。我可以跳过AJAX调用的路由过程吗? (我知道答案主要是NO,但也许我可以针对AJAX调用进一步优化我的调用)

我认为没有任何反对意见。除了RESTfull API之外,我经常使用它。

答案 1 :(得分:1)

您是否描述了ZF的路由组件的性能,还是假设这是您的应用程序的“瓶颈”?!

在我看来,如果您需要低延迟,通过禁用最舒适的功能来优化页面速度并不是获得目标的最佳尝试。您是否应该开始优化SQL查询(slowlog是此处的关键字)或其他内容(xdebug可以真正帮助您分析应用程序并发现瓶颈)。

一切都与时间有关......

在zend框架启动之前缓存怎么样?在解释器(php)启动之前缓存和交付怎么样?听起来不错?您可能希望使用Varnish之类的代理来实现良好的低延迟响应并执行类似的操作。

即使您从代理中获得了缓存缺失,您也希望使用 PHP操作码缓存(如APC,XCache,...)。 如果您想知道如何加速和优化您的zend框架,您需要阅读Zend Performance Guide

答案 2 :(得分:0)

你有两种方法可以扩展Zend_Front_Controller并覆盖它的调度方法并设置你自己的前端,或者在zend代码本身进行更改。

打开

Zend/Controller/Front.php

dispatch()方法

查找并删除以下代码

 $router = $this->getRouter();
    $router->setParams($this->getParams());

 $this->_plugins->routeStartup($this->_request);



      try {
            $router->route($this->_request);
        }  catch (Exception $e) {
            if ($this->throwExceptions()) {
                throw $e;
            }

            $this->_response->setException($e);
        }

        /**
        * Notify plugins of router completion
        */
        $this->_plugins->routeShutdown($this->_request);

执行此操作后,请使用请求对象$ this-&gt; _request 并根据url参数设置控制器,操作,模块名称。

$this->_request()->setModuleName($get[0]);