我有一个返回大量结果的查询,而我的代码内存不足,试图解析结果......如何在CakePHP中运行查询并获得正常结果?
解析它我的意思是....
SELECT table1.*, table2.* FROM table1 INNER JOIN table2 ON table1.id = table2.table1_id
通过上述查询,它将返回....
array(
0 => array(
'table1' => array(
'field1' => value,
'field2' => value
),
'table2' => array(
'field1' => value,
'field2' => value
)
)
)
当它将这些结果解析为嵌套数组时,它的内存不足......我该如何避免这种情况?
我不能比现在更讨厌CakePHP: - \如果文档很合适,那将是一回事,但它并不合适,而且它的功能很烦人。
答案 0 :(得分:0)
$list = $this->AnyModel->query("SELECT * FROM big_table");
但我不认为这会解决你的问题,因为如果你有例如10millon行...... php将无法管理10millon值的数组......
但您可能想要阅读这两个链接来更改execution time和memory limit ..您也可以在php.ini上更改它们
祝你好运!
<强> EDITED 强> 嗯,多亏了你的问题我已经学到了一些东西:P首先,我们都同意你收到那个错误,因为Cake执行查询并试图将结果存储在一个数组中,但php不支持一个大的数组所以它耗尽了内存和崩溃..我从来没有使用过经典的mysql_query()(我更喜欢PDO)但是在阅读文档后,似乎mysql_query将结果存储在resource内,因此,它没有加载内存上的结果,并允许您循环结果(如通过大文件循环)。所以现在我看到了差异......而你的问题实际上就是这个:
Can I stop CakePHP fetching all rows for a query?
=)我理解你对蛋糕的挫败感,有时我也会对它感到沮丧(你能否相信没有简单的方法来执行带有HAVING子句的查询?u_U)
干杯!
答案 1 :(得分:0)
我建议您在模型上使用Containable
行为。这是控制返回的数据量的最简单方法。我确信这正是您需要实施的目标。
答案 2 :(得分:0)
您应该限制查询返回的行(如500行),并允许用户在需要时获取更多行(一次下一行500行)。你可以用分页组件和一点AJAX很好地做到这一点。