2

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

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

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

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

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

    return self::$Instance;
}

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

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

我的确切问题是

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

感谢任何专家的建议。

4

2 回答 2

7

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

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

于 2012-05-07T07:45:19.527 回答
2

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

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

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

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

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

于 2012-05-07T07:49:05.600 回答