symfony propel doselect時,因為一次拿出的資料太大,導致記憶體溢出怎麼辦?
用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
用doSelect,會把所有行一次取出來丟到記憶體裡,如果你的結果集比較大,自然會炸;你可以用逐行操作來控制記憶體峰值:
還有一些不治標的偷懶辦法: