【问题标题】:Return a large array from a function从函数返回一个大数组
【发布时间】:2013-05-04 04:19:26
【问题描述】:

我有一个用于管理其数据库获取的应用程序的类。我不想使用类中的结果集 (PDOStatement) 并从那里回显 html,而是想使用 fetchAll() 将结果集返回到页面

return $stmt->fetchAll(PDO::FETCH_ASSOC);

编辑:我不想返回$stmt,因为据我所知,单个连接中存在多个现有PDOStatement 对象并不好。为了避免风险,我想在类中管理这些对象。如果我错了,请纠正我。

假设数组不会超过 100k 行,可能是 10k-50k,是否有任何性能原因(或任何原因)为什么我不应该这样做?我知道这是非常基本的,但是处理这个的首选方法是什么?

如果我这样做而不是在类方法中直接使用它,它会对内存产生任何影响吗?我认为没关系,但我想听听 SO。

【问题讨论】:

  • 处理大型数组会对内存产生很大影响,为什么不返回 $stmt 并一次提取一行
  • 定义你的函数,让它接受一个目标参数,像这样:function getData( $parm1, $parm2, &$dest_var );然后像这样调用它:$my_data = NULL; getData( 'parm1', 'parm2', $my_data ); 在您的 fetch 函数中,您不会返回一个大数组,而是将其分配给传递的参数,这可能更节省内存。
  • @MarkBaker 几个页面元素可能会使用这个数据类对象,我不想冒在类之外有多个 PDOStatement 对象的风险。如果已经有一个光标未到达末尾,则创建一个将失败。所以我想让它们在类方法的范围内进行管理。
  • @J.D.Pace 聪明的想法 :) 如果没有别的,我可能会尝试。谢谢。

标签: php function memory-management return resultset


【解决方案1】:

如果存在内存问题,那么无论你在做什么,调用 fetch all 都不是你的朋友……你最好在循环中调用 $stmt->fetch。由于 php 通过函数内的引用处理传递数组与推迟到另一个应该具有大致相同的内存和性能配置文件。

【讨论】:

  • 您的意思是返回$stmt 并从调用范围循环?请参阅我的编辑,了解我想避免这种情况的原因。
  • 更多的数据需要更多的资源,我想最大的问题是你在哪里有伸展的空间。如果数据库过载到打开多个并发语句会成为问题的程度,那么 fetchAll 将是更好的选择。如果内存是问题,那么返回语句对象并在调用范围内遍历它会更好。
猜你喜欢
  • 2011-06-23
  • 2023-04-08
  • 2014-09-16
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多