【问题标题】:Is the whole Zend Framework stack rebuilt for each request?是否为每个请求重建了整个 Zend Framework 堆栈?
【发布时间】:2014-06-05 15:12:15
【问题描述】:

我正在开发一个使用 php 和 zend 框架 2 构建的 Web 应用程序。我来自 Java EE 背景。在我看来,对于每个 http 请求,整个 zend 应用程序堆栈都在重建,从磁盘读取大量配置文件,构建我所有的服务等等。这个对吗?如果是这样,与 Java EE 方法相比,在 Web 服务器启动时初始化大量应用程序服务,然后在许多请求中具有生命周期,这对我来说似乎相当奇怪和低效。看到浏览器发出很多小的 Ajax 请求,这种 php/zend 方法是不是非常慢?我是否需要在处理 Web 应用程序设计的方式上进行范式转变?

【问题讨论】:

  • 这是独立于框架的。 PHP 上的一切都是按请求进行的。重新读取所有文件。这就是操作码缓存发挥作用的地方,因此我们已经在内存中拥有了所有相关的东西。缓存是 php 中 Web 开发的重要组成部分。
  • 我明白了,感谢您确认这是 PHP 方式。
  • @Sam 我想你想说的是所有需要的文件都被重新读取了。正如我在下面所描述的,并不是每个请求都会读取应用程序和 zf2 的所有文件,而只会读取包含初始化类或配置的文件。甚至那些不会像您正确描述的那样从磁盘读取,它们在大多数情况下来自内存或缓存,坦克到 apache,视图缓存,配置缓存等等。

标签: php web-applications zend-framework2


【解决方案1】:
  • ZF2 可以使用缓存来提高性能,配置也 也可以缓存。

  • ZF2 中的任何服务或类都不应该在每个请求上都构建,例如 db 连接(ZF2 不会尝试连接到 db,除非你真的对 db 服务器做某事)

另一个例子:

假设你有一个 REST API,你只需要在一个控制器上使用,不需要在每个请求上构造这个 api,你或者要求你的模块的服务管理器只在那个控制器上为你构造那个对象。

看看这个博客,它可能对你有帮助:http://www.masterzendframework.com/articles-2/zend-framework-2-core-concepts-understanding-dependency-injection

http://akrabat.com/ 或 ZF2 团队负责人:Matthew Weier O'Phinney http://mwop.net/

(如果我理解您的问题,如果不理解,请见谅)

【讨论】:

    【解决方案2】:

    php 不像 java 那样在环境中运行是正确的。 这意味着您的 php 应用程序正在对每个请求进行初始化

    在我看来,对于每个 http 请求,整个 zend 应用程序堆栈都在重建

    但这是不正确的。当您来自 java 时,您的 php- / zf2- 应用程序的初始化并不像您想象的那么繁重。 不要想像在每个请求上都重新启动一个 tomcat 服务器之类的东西。整个 Zend 框架也没有加载,您的应用程序类也没有加载。 仅加载您的特定请求所需的类。

    PHP 框架为此使用了自动加载器,因此如果您在应用程序中调用 new MyClass(),该类将被加载。在许多情况下,甚至包含“MyClass”的文件也不是从磁盘加载的,而是从内存或字节码缓存中加载的。

    如果您的服务器设置正确,例如 zf2 框架应用程序将在几毫秒内加载。

    哪些服务需要为您的应用程序做好准备?

    它们只不过是配置中关联数组中的“键”。当您的应用程序需要为您的特定请求提供服务时,它将非常快速地在您的配置数组中找到该条目。服务将从工厂方法或工厂类初始化,仅针对此请求,但仅针对需要的特定请求。

    Facebook 也在使用 php。每个请求都不需要一分钟,对吧?如果 php 以您目前所想的方式工作,我猜这将需要几分钟或几小时 - 或者只是超时:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 2011-07-22
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      相关资源
      最近更新 更多