suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Was soll ich tun, wenn der Symfony Propel Doselect-Speicher überläuft?

Was soll ich tun, wenn der Speicher überläuft, weil zu viele Daten auf einmal entnommen werden, wenn ich Symfony Propel Doselect verwende?

漂亮男人漂亮男人2831 Tage vor490

Antworte allen(1)Ich werde antworten

  • 我想大声告诉你

    我想大声告诉你2017-05-16 16:48:11

    用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

    Antwort
    0
  • StornierenAntwort