私は最近、PHPプログラムを開発しているときに次の問題に遭遇しました:
PHP 致命的エラー: 許可されたメモリ サイズ 268 435 456 バイトが使い果たされました
エラー メッセージは、最大許容メモリが使い果たされたことを示しています。最初はこのようなエラーが発生したことに驚きましたが、よく考えてみると、私が開発しているプログラムは foreach ループ ステートメントを使用して 40,000 レコードのデータを持つテーブル内の特定の特性を検索することになっているため、驚くべきことではありません。つまり、一度に4万件のデータを取り出し、毎日のデータを1つずつチェックする必要があります。 40,000 個のデータがすべてメモリに読み込まれていると考えられます。メモリがバーストしないのは不思議です。
結局、何年もプログラミングをしてきたので、PHP が提供する API はデータを一度にロードせず、ストリーミング メディアのように使用して失われる可能性があり、データが蓄積されないことを漠然と覚えています。想い出。簡単に検索したところ、公式Webサイトに正しい使用方法が見つかりました。
この問題は、PHP の公式 Web サイトでは「バッファー付きクエリ」と「バッファーなしクエリ」と呼ばれています。 PHP のデフォルトのクエリ モードはバッファ モードです。つまり、クエリ データの結果は、PHP プログラムによる処理のために一度にメモリに抽出されます。これにより、PHP プログラムに行数のカウント、特定の行へのポインタの指示などの追加機能が与えられます。さらに重要なことは、プログラムがデータ セットに対して二次クエリとフィルタリング操作を繰り返し実行できることです。ただし、このバッファー クエリ モードの欠点は、メモリを消費すること、つまり、速度と引き換えにスペースを消費することです。
対照的に、別の PHP クエリ モードはバッファなしクエリであり、データベース サーバーはデータを一度に返すのではなく 1 つずつ返します。その結果、PHP プログラムが消費するメモリは少なくなりますが、データベース サーバーへの負荷は増大します。すべてのデータがフェッチされるまで、データベースは PHP がデータをフェッチするのを待機するためです。
明らかに、バッファー クエリ モードは少量のデータ量のクエリに適しており、非バッファー クエリは大量のデータ量のクエリに適しています。
PHP のバッファー モード クエリについては誰もが知っています。以下に示す例は、非バッファー クエリ API を実行する方法です。
非バッファークエリメソッド 1: mysqli
リーリー非バッファークエリメソッド 2: pdo_mysql
リーリー非バッファークエリメソッド 3: mysql
リーリー上記の内容は、PHPで大量のデータを循環させた際のメモリ不足の問題を解決するためにエディターが共有した方法です。皆様のお役に立てれば幸いです。