2

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

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

以下是我的问题:

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

笔记:

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

提前致谢。

4

3 回答 3

3

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

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

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

嗯,就是这样,路由主要用于灵活性、国际化、搜索引擎优化。

Zend 框架路由器的问题在于它依赖并包装了前端控制器实例,因此很难(完全不可能)缓存路由器,因为 FC 本身包装了其他东西,例如不可缓存的 PDO 实例。

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

在避免路由计算的情况下使用复杂路由时,一个可能的解决方案是将所有路由转储到本机 Apache Rewrite Rules,与 ZF 相比,它会非常快,该解决方案的主要问题是您需要手动计算反向路由,并且无论何时进行更改路线,您需要手动编辑它。

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

3. 制作自定义路线有什么好处?对SEO更好吗?

好吧,它“取决于”(tm):

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

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

其他优点:

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

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

我没有看到任何反对这一点的缺点。我经常去,除了 RESTfull API。

于 2012-05-10T13:06:30.400 回答
1

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

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

都是时间问题...

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

即使您从代理中获得缓存未命中,您也希望使用PHP 操作码缓存(如 APC、XCache 等)。如果您询问如何加速和优化您的 zend 框架,请阅读Zend 性能指南

于 2012-04-26T17:16:45.840 回答
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->_request 并根据 url 参数设置控制器、操作、模块名称。

$this->_request()->setModuleName($get[0]);
于 2012-04-09T08:38:46.490 回答