好的,这是专业人士的一个:

几年来,我一直在研究自己的php Orm/activerecord实现 猪肉。

这是根据几年前看过的“在5分钟内用Rails在5分钟内用Rails制作自己的网站”的宽松地。您可以做这样的事情:

$clients = dbObject::Search("Client", array("ID > 500")); 

或者

$client = new Client(218); // fetch row with id 218 from client table

或者

$projects = $client->Find('Project');

这将从数据库中获取一个或多个行,将它们包裹在dbobject中,然后将它们返回一个数组,或者返回false,没有结果。

所有这些都在数十个站点和后端都完美地工作,但是现在我的同事正在使用它来创建一个巨大的logparser,而这里开始记忆使用问题。

他运行的查询可以返回超过20.000行,甚至更多的行,这绝对不是一件好事,一次包裹在对象包装器中并作为一个阵列返回。

明显的解决方案是返回一个实现该对象 迭代器 接口而不是数组。它不应立即从结果集中获取所有记录,而应该保留生成数据库查询的结果资源,然后在您遍历对象时内部使用mysql_fetch_*,就好像它是一个数组一样。

现在我们要解决我的真正问题:我可以毫无问题地做到这一点吗?数据库是否能够处理多个开放结果集,并将它们混合并保持记忆一段时间?

例如,获取20个对象,将它们循环,让这20个获取其他5个,在他们依次拿出3个其他3个。这将创建一个循环,其中许多不同的结果处理将保存在内存中。

我知道我不能序列化这些对象之一,但是我可以在PHP5中没有任何问题而实现此目标,还是数据库接口会给我带来问题吗?

有帮助吗?

解决方案

这取决于您正在使用的数据库以及数据库配置。

对于MySQL,您需要确保使用缓冲查询。在PDO中,您将其设置为这样:

$myPdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

这意味着所有数据将发送给客户端(与在PHP中获取所有数据不同)。

另一种(可能更糟糕的是)替代方法是每当您检测到正在运行的查询时,结果集仍打开。

正常 mysql_query() 使用缓冲查询,因此可以与多个结果集一起使用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top