84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
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,會把所有行一次取出來丟到記憶體裡,如果你的結果集比較大,自然會炸;你可以用逐行操作來控制記憶體峰值:
還有一些不治標的偷懶辦法: