【问题标题】:Dependency Injection, PHP and performance concerns依赖注入、PHP 和性能问题
【发布时间】:2012-04-25 03:38:48
【问题描述】:

我已经看到许多框架在 php 中实现了 DI。但是,由于 php 中的所有对象都是在单个请求的生命周期内创建和销毁的,我想知道这会如何影响性能。

通常,您将在 DI 容器内定义许多对象。在 php 中,即使 Controller 不需要这些对象中的大部分,它们仍然会被实例化。 此外,如果您在 php 文件中声明 DI 依赖项,您将加载所有引用的脚本。如果没有 DI,您只会加载您需要的内容。

我看到一些框架允许惰性 DI,所以这应该有助于不需要的实例化。也许分割 DI 也是解决第一个问题的一种方法。 那么,DI 是否会对我的 php 应用程序性能产生不利影响,我应该如何在 php 中实现 DI 以使其不会发生?

【问题讨论】:

  • 您的应用程序是否已达到这种额外开销实际上会导致问题的程度?或者您在编写第一个<?php ?> 标签对之前就已经担心这个问题了?不要一开始就进行微优化。
  • 应用程序存在性能问题,部分大修正在重构应用程序,使其更加模块化,引入了 di fwks、学说 2 等,以便更容易维护和优化。我不希望这会带来额外的性能损失。
  • 我不认为决定采用 DI 方法/框架是一种微优化。这是一个应用程序基础。

标签: php dependency-injection inversion-of-control ioc-container


【解决方案1】:

通常,您将在 DI 容器内定义许多对象。在 php 中,即使 Controller 不需要这些对象中的大部分,它们仍然会被实例化。

嗯,还有延迟初始化,所以这些对象只是轻量级占位符,如果需要功能,只在需要时创建大对象。

那么,DI 是否会对我的 php 应用程序性能产生不利影响,我应该如何在 php 中实现 DI 以使其不会发生?

每一行代码都会影响应用程序的性能,因此无论您做什么,都需要处理它。如果你真的关心性能,你应该从缓存应用程序的输出开始,这样除非你需要,否则不需要加载任何代码。

【讨论】:

    【解决方案2】:

    你必须确定是否有问题,然后是什么问题。

    • 您是否有需要花费大量资源和时间来构建的依赖项?

    您可以使用惰性注入,例如:

    class Class1 {
        /**
         * @Inject(lazy=true)
         * @var Class2
         */
        private $class2;
    
        public function doSomething() {
            // The dependency is loaded NOW
            return $this->class2->getSomethingElse();
        }
    

    (来自PHP-DI的示例)

    • 您的类中是否有太多依赖项?

    您必须问自己,依赖注入是否真的是问题所在。如果您在哪里创建新实例(或使用单例)而不是使用 DI,问题会消失吗? (我不这么认为)

    IMO 性能方面的考虑应清楚地表明 DI 是问题所在。应用程序中有很多部分可能出错。

    【讨论】:

      猜你喜欢
      • 2010-09-30
      • 2018-06-28
      • 2015-11-21
      • 2014-05-27
      • 1970-01-01
      • 2014-12-27
      • 2015-04-22
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多