使用 ORM 时的 PHP 性能和内存

Posted

技术标签:

【中文标题】使用 ORM 时的 PHP 性能和内存【英文标题】:PHP performance and memory when using ORM 【发布时间】:2012-07-20 13:30:16 【问题描述】:

我正在使用 PDO 来获取对象的行。 我有两个问题:

1- 在对象中使用私有属性并使用 __get() 方法返回它们,该方法本身可能会调用另一个函数,例如 getLabel(),这在检索大量记录时如何影响 php 性能?可以接受吗?

一个例子:

class model

  private p1;
  public p2;
  function __get($name)
  
    return $this->'get'.$name();
  
  function getP1()
  
    return '';
  


$obj = new model;
$obj->p1 VS. $obj->p2

2- 对于具有许多列的类,在类定义中定义所有这些列,然后在检索大量记录时选择其中一些,这如何影响 php 内存使用,因为它们是在具有空值的对象中定义的?可以接受吗?

我不会一一获取行,也不是一次全部获取。

一个例子:

class model

  public $p1 = null;
  public $p2 = null;
  public $p3 = null;
  public $p4 = null;
  public $p5 = null;
  public $p6 = null;
  public $p7 = null;
  public $p8 = null;
  public $p9 = null;
  public $p10 = null;


sql: select p1, p2 from model limit 100

每个对象都有 8 个未使用的属性。这对 php 性能和内存有何影响?

据我所知,学说使用这两种模式。他们如何克服这种影响 php 性能的问题?

【问题讨论】:

【参考方案1】:

在对象中使用私有属性并使用 __get() 方法返回它们,该方法本身可能调用另一个函数,例如 getLabel(),这在检索大量记录时如何影响 php 性能?可以接受吗?

与其他常见的解决方法相比,魔术方法的成本很高。如果没有看到您的应用程序,很难说到底有多贵。

__get/__set/__call performance questions with PHP

对于具有许多列的类,在类定义中定义所有这些列,然后在检索大量记录时选择其中一些,这如何影响 php 内存使用,因为它们是在具有空值的对象中定义的?可以接受吗?

只要您使用 PDO 遍历结果集,您的内存就不会太高。但是,如果您遍历结果并将它们保存到一个集合中,那么您的整个结果集将占用大量内存。与往常一样,您希望选择尽可能少的字段和行。

【讨论】:

以上是关于使用 ORM 时的 PHP 性能和内存的主要内容,如果未能解决你的问题,请参考以下文章

PHP的性能探讨和测试

php 执行mysql中查询时内存溢出怎么办

从原理分析PHP性能

Android性能优化:内存优化

nodejs - 处理许多json文件时的内存问题

Android常见内存泄露,学会这六招优化APP性能