ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルで大量のデータをループするときのメモリ枯渇の問題の解決策

PHP_PHP チュートリアルで大量のデータをループするときのメモリ枯渇の問題の解決策

WBOY
リリース: 2016-07-12 09:07:50
オリジナル
883 人が閲覧しました

PHPが大量のデータをループするときのメモリ枯渇の問題の解決策

最近、PHP プログラムの開発中に次のエラーが発生しました:

PHP 致命的エラー: 許可されたメモリ サイズ 268 435 456 バイトが使い果たされました

エラー メッセージは、最大許容メモリが使い果たされたことを示しています。最初はこのようなエラーが発生したことに驚きましたが、よく考えてみると、私が開発しているプログラムでは foreach ループ ステートメントを使用して、40,000 レコードのデータを持つテーブル内の特定の特性を持つテーブル全体を検索するため、驚くべきことではありません。つまり一度に40,000件のデータを取り出し、毎日のデータを一つ一つチェックしなければなりません。 40,000 個のデータがすべてメモリに読み込まれていると考えられます。メモリがバーストしないのは不思議です。

結局、何年もプログラミングをしてきたので、PHP が提供する API はデータを一度にロードせず、ストリーミング メディアのように使用して失われる可能性があり、データが蓄積されないことを漠然と覚えています。想い出。簡単に検索したところ、公式Webサイトに正しい使用方法が見つかりました。

この問題は、PHP の公式 Web サイトでは「バッファー付きクエリ」と「バッファーなしクエリ」と呼ばれています。 PHP のデフォルトのクエリ モードはバッファ モードです。つまり、クエリ データの結果は、PHP プログラムによる処理のために一度にメモリに抽出されます。これにより、PHP プログラムに行数のカウント、特定の行へのポインタの指示などの追加機能が与えられます。さらに重要なことは、プログラムがデータ セットに対して二次クエリとフィルタリング操作を繰り返し実行できることです。ただし、このバッファー クエリ モードの欠点は、メモリを消費すること、つまり、速度と引き換えにスペースを消費することです。

対照的に、別の PHP クエリ モードはバッファなしクエリであり、データベース サーバーはデータを一度に返すのではなく 1 つずつ返します。その結果、PHP プログラムが消費するメモリは少なくなりますが、データベース サーバーへの負荷は増大します。すべてのデータがフェッチされるまで、データベースは PHP がデータをフェッチするのを待機するためです。

明らかに、バッファー クエリ モードは少量のデータ量のクエリに適しており、非バッファー クエリは大量のデータ量のクエリに適しています。

PHP のバッファー モード クエリについては誰もが知っています。以下に示す例は、非バッファー クエリ API を実行する方法です。

非バッファークエリメソッド 1: mysqli

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); $uresult = $mysqli->query("都市から名前を選択", MYSQLI_USE_RESULT);

if ($uresult) {

while ($row = $uresult->fetch_assoc()) {
エコー $row['名前'] .PHP_EOL
}
}
$uresult->close(); ?>

非バッファークエリメソッド 2: pdo_mysql

$pdo = 新しい PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);


$uresult = $pdo->query("都市から名前を選択"); if ($result) {
while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {

エコー $row['名前'] .PHP_EOL

}
}
?>


非バッファークエリメソッド 3: mysql

$conn = mysql_connect("localhost", "my_user", "my_pass"); $db = mysql_select_db("ワールド");

$uresult = mysql_unbuffered_query("都市から名前を選択"); if ($result) {

while ($row = mysql_fetch_assoc($uresult)) {
エコー $row['名前'] .PHP_EOL
}

}

?>






http://www.bkjia.com/PHPjc/1059209.html
www.bkjia.com

tru​​e

技術記事 PHP で大量のデータをループするときにメモリが枯渇する問題の解決策。最近、PHP プログラムの開発中に次のエラーが発生しました: PHP 致命的なエラー: 許容メモリ サイズは 268 435 456 バイトです...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート