【问题标题】:Performance when Instantiating an object in php在 php 中实例化对象时的性能
【发布时间】:2012-05-15 17:53:26
【问题描述】:

想问一下php中实例化对象的性能和内存使用情况。

在我的应用程序的每个 php 文件中,我都包含一个连接到数据库的文件。

$db->DB::getInstance();
$db->connect('all my credentials');

这是我的 db 类中的 getInstance() 函数。

//singleton database instance
public static function getInstance() {
    if (!self::$Instance) {
        self::$Instance = new DB();
    }

    return self::$Instance;
}

目前一切都很好。但我担心性能问题,如能否改进、可能存在缺陷等。

我研究并发现单例实例可以帮助节省内存。如果它已经被实例化,它将重用该对象。我说的对吗?

我的确切问题是

例如如果我有 10 个用户访问脚本,这是否意味着该对象将被实例化 10 次?发生这种情况时,我的内存使用量会增加 10 倍吗? -> 这就是我感兴趣的地方

感谢任何专家的建议。

【问题讨论】:

  • (相关) Who needs Singletons
  • 但是,如果它是 mysqli 类,则使用相同的实例可能会阻止创建新连接。这取决于您的类构造函数在做什么。但无论如何它与创建对象本身无关。

标签: php performance memory


【解决方案1】:

与所有性能调整一样,您应该衡量自己在做什么,而不是盲目地执行一些您不完全理解的伏都教仪式。当您在$_SESSION 中保存对象时,PHP 将捕获对象状态并从中生成文件(序列化)。在下一次请求时,PHP 将创建一个新对象并使用此状态重新填充它。这个过程比创建对象要昂贵得多,因为 PHP 必须进行磁盘 I/O 然后解析序列化数据。这必须在读取和写入时都发生。

一般来说,PHP 被设计为无共享架构。这有其优点和缺点,但试图以某种方式回避它通常不是一个好主意。

【讨论】:

  • 我的观点相同。不要试图在错误的地方调整东西。在这种情况下,是否使用单例实例并不重要。但是,是的,您的对象总是针对每个请求单独创建。我的意思是,不然怎么会这样,PHP 是一种脚本语言。
  • 其实用Sessions也不错。会话写入和读取是一个非常快速的过程(在任何体面的服务器上,读取和写入文件几乎是您可以做的最快的非 PHP 操作)。它通常比数据库请求更快,并且大多数现代框架高度依赖文件读/写来进行会话、缓存和其他目的。所以作为一个开发者,你不应该害怕文件读/写。
  • @kristovaher 与其说害怕不如说是意识到磁盘 i/o 很慢。
  • 非常感谢,我会看看使用会话。
  • @Gordon 除非您的网站是静态的,否则无论如何您都将使用磁盘 i/o。甚至数据库查询也是磁盘 i/o,包括文件和 PHP 脚本所做的大部分事情。重要的是,在使用会话时,只有在需要时才使用 session_start()。永远不要为每个请求使用 session_start(),因为它确实会对性能造成很小的影响(不仅仅是因为磁盘读/写,还因为标头)。只有在请求或写入会话数据时才应启动会话。
【解决方案2】:

不要使用 Singleton,这会让测试变得很糟糕。

默认情况下,对象在 PHP 中作为引用在系统中发送。因此,您可以简单地在系统中的其他类周围共享该数据库连接对象,而不会影响性能(它不会克隆它们,直到您明确命令它被克隆)。

但是是的,如果有十个用户使用您的系统,那么这意味着您将拥有该类的十个实例。这意味着如果用户的所有请求同时处于活动状态,则内存使用量要高 10 倍(嗯,通常,根据负载和服务器设置,一些请求可能必须等到其他请求完成)。

可以告诉 PHP 和数据库使用持久连接,这意味着使用相同数据库用户名和密码并连接到同一数据库的其他脚本共享“连接”。但几乎不建议这样做,因为来自一个用户的请求可能会减慢另一个用户的体验,后者必须等待前一个用户的数据库查询完成。

所以,简而言之,不要使用单例。在智能的面向对象架构中,类被传递给子对象或从父对象继承。这意味着可以轻松更改类或轻松创建模型以进行测试。

【讨论】:

  • 感谢您的反馈!很有帮助。
  • 单身很糟糕,是的。更智能的设计模式是单例工厂或任何类型的依赖注入容器。
  • Singletons 还不错,在某些情况下最好使用它们而不是其他解决方案,例如 NullObject
  • 这更像是缓存而不是单例。当单例成为上帝的对象时,它通常是不好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2016-01-18
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多