用doSelect,会把所有行一次性取出来扔到内存里,如果你的结果集比较大,自然会炸;你可以用逐行操作来控制内存峰值:
/* 方法1.a */
$stmt = YourPeer::doSelectStmt($criteria); // <= 预处理
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 逐行操作$row
}
/* 方法1.b */
$rs = YourPeer::doSelectRS($criteria); // <= 取回一个打了包装的结果集
$rs->setFetchMode(ResultSet::FETCHMODE_ASSOC);
while($rs->next()) {
$row = $rs->getRow();
// 逐行操作$row
}
还有一些不治标的偷懒办法:
/* 方法2:如果不需要把数据结果映射成对象,可以只获取指定的字段;不映射成对象,也能省内存 */
$criteria = new Criteria();
$criteria->clearSelectColumns()->addSelectColumn(YourPeer::COL_NAME);
// 然后⋯⋯
/* 方法3:在php.ini里增大PHP运行内存限制 */
memory_limit = 1111M