优化 Zend 框架路由


Optimizing Zend framework routes

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

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

以下是我的问题:

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

注意:

我了解路由过程本身以及它在 Zend 中的工作方式框架。但是,由于我不将使用大多数功能可用 我想也许是时候微调:)

提前谢谢。

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

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

阿拉伯数字。由于我永远不会更改路由,有没有办法使路由过程更快?例如缓存?跳过路由 完全是过程?或任何其他技术?

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

Zend Framework Router 的问题在于它依赖于并包装前端控制器实例,因此很难(不可能 afaik)缓存路由器,因为 FC 本身包装了其他不可缓存的 PDO 实例等内容。

因此,对于每个请求,都会一次又一次地计算所有路由。

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

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

3 .定制路线的优点是什么?对SEO更好吗?

好吧,它"取决于"(tm):

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

然而,/products/page/1/products?page=1是双赢的(实际上并非如此,但这是另一回事)。

其他优点:

  • i18n
  • 搜索引擎优化
  • 可用性
  • 有意义的网址

4 .是否可以跳过 AJAX 调用的路由过程?(我知道答案大多是否定的,但也许我可以针对 AJAX 调用进一步优化我的调用)

我看不出有什么缺点。我经常这样做,除了RESTfull API。

您是否分析了 ZF 路由组件的性能,或者是否假设这是应用程序的"瓶颈"?!

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

一切都与时机有关...

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

即使你从代理那里得到缓存未命中,你也想使用PHP操作码缓存(如APC,XCache等)。对于如何加速和优化 zend 框架的问题,您需要阅读 Zend 性能指南。

你有两种方法,要么扩展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->_request并根据URL参数设置控制器、动作、模块名称。

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