8

データベースにクエリを実行し、mysqli_result で結果を取得すると、メモリ使用量は非常に少なくなります。ただし、クエリ結果のすべての行を連想配列にフェッチすると、メモリ使用量が非常に高くなります。

<?php
    require_once("../config.php"); //db connection config
    $db = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_DBASE);

    $query ="select * from table_name";
    if($r = $db->query($query)){
    echo "MEMORY USAGE before :  ". memory_get_usage()."<br><br>";
    $rows = array();
    while($row = $r->fetch_assoc()){

        $rows[]= $row;
    }
    echo "MEMORY USAGE after :  ". memory_get_usage()."<br><br>";


    //before: 660880
    //after:  114655768
    // # of records: around 30 thousands
?>

これほど多くの結果を保存するのは非常にメモリを消費することは理にかなっていますが、どうして mysqli_result がこんなに小さいのか不思議に思っています。fetch_assoc が呼び出されるたびに結果が dbase に照会されるわけではありません。それでは、メモリに保存されている結果はどこにありますか。

4

2 に答える 2

2

結果のフェッチとリソースへのポインターの格納には大きな違いがあります。

echo $r;最初に呼び出す前に、memory_get_usage();それが単なるポインターであることに気付くでしょう。これは、結果セットへのポインターです。結果が得られるまでfetch、結果セットは実際にはメモリに保存されません。

fetchAll()あなたがやろうとしていることのために走ることをお勧めします。これにより、PHP のループではなく mysqli 拡張機能 (C ライブラリ) でポーンオフされるため、1 つのメソッドがすべての結果にアクセスし、パフォーマンスが向上します。

また、無料の結果機能を使用して、作業が終了したときにメモリから結果をクリアすることもできます。これは、Java でカーソルを閉じるようなものです。

于 2012-07-29T04:30:30.633 に答える
1

代わりにこれを行うべきだと思います:

while($row = $r->fetch_assoc()){
   //Do whatever you need with the record, then:
   unset($row);
}

あなたが投稿した方法は、に巨大な配列を集めており$rows、メモリ使用量はそれを反映しています。

于 2012-07-29T03:34:25.193 に答える