在 php 中实例化对象时的性能


Performance when Instantiating an object in php

我想问一下在 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 倍的负载吗?->这是我感兴趣的

感谢任何专家建议。

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

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

不要使用Singleton的,它使测试变得地狱。

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

但是,是的,如果有十个

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

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

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