我想问一下在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;
}
目前一切都很顺利。但我担心性能问题,如可以改进,可能存在缺陷等等。
我研究并发现单例实例可以帮助节省内存。如果对象已经实例化,它将重用该对象。我是对的吗?
我的确切问题是
E.g。如果我有10个用户访问脚本,是否意味着该对象将实例化10次?当发生这种情况时,它会对我的内存使用量加上10倍的负载吗? - >这是我感兴趣的
感谢任何专家意见。
答案 0 :(得分:6)
与所有性能调整一样,你应该衡量你正在做什么,而不是盲目地执行一些你并不完全理解的伏都教仪式。在$_SESSION
中保存对象时,PHP将捕获对象状态并从中生成文件(序列化)。在下一个请求时,PHP将创建一个新对象并使用此状态重新填充它。这个过程比创建对象要昂贵得多,因为PHP必须进行磁盘I / O然后解析序列化数据。这必须在读写时发生。
通常,PHP被设计为无共享架构。这有其优点和缺点,但试图以某种方式回避它,通常不是一个好主意。
答案 1 :(得分:2)
不要使用Singleton,它会让测试成为一个地狱。
默认情况下,对象在PHP中作为引用在系统中发送。因此,您可以简单地在系统中的其他类周围共享该数据库连接对象,而不会影响性能(在您专门命令克隆它之前,它不会克隆它们。)
但是,是的,如果十个用户使用您的系统,则意味着您将拥有该类的十个实例。这意味着如果用户的所有请求同时处于活动状态,内存使用率会高十倍(通常,根据负载和服务器设置,某些请求可能需要等到其他请求完成)。
可以告诉PHP和数据库使用持久连接,这意味着使用相同数据库用户名和密码并连接到同一数据库的其他脚本共享“连接”。但这几乎从未被推荐过,因为来自一个用户的请求可能会降低在先前用户数据库查询完成时必须等待的另一个用户的体验。
因此,简而言之,不要使用单身人士。在面向对象的智能体系结构中,类被传递给子对象或从父对象继承。这意味着可以轻松更改类,或者可以轻松创建模型以用于测试目的。