PHP で非バッファモードを使用してデータベースにクエリを実行する方法

墨辰丷
リリース: 2023-03-28 06:52:01
オリジナル
1361 人が閲覧しました

バッファされたクエリとバッファされていないクエリ。 PHP のデフォルトのクエリ モードはバッファ モードです。つまり、クエリ データの結果は、PHP プログラムで処理するために一度にメモリに抽出されます。必要な友人はそれを参照できます

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

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

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

結局、何年もプログラミングをしてきて、PHP が提供する API は、データを一度にロードせず、ストリーミング メディアのように使用して失われる可能性があり、データが蓄積されないクエリ メソッドであることをぼんやりと覚えています。記憶の中で。簡単に検索したところ、公式Webサイトに正しい使用方法が見つかりました。バッファされたクエリとバッファされていないクエリ。 PHP のデフォルトのクエリ モードはバッファ モードです。つまり、クエリ データの結果は、PHP プログラムによる処理のために一度にメモリに抽出されます。これにより、PHP プログラムに行数のカウント、特定の行へのポインタの指示などの追加機能が与えられます。さらに重要なことは、プログラムがデータ セットに対して二次クエリとフィルタリング操作を繰り返し実行できることです。ただし、このバッファー クエリ モードの欠点は、メモリを消費することです。

もう 1 つの PHP クエリ モードは、データベース サーバーが一度にすべてのデータを返すのではなく、1 つずつデータを返すことにより、PHP プログラムの消費メモリが少なくなりますが、データベースの負荷が増加します。すべてのデータが取得されるまで、PHP がデータを取得するのを待ちます。

非バッファ型クエリ方法 1: mysqli

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
 
if ($uresult) {
  while ($row = $uresult->fetch_assoc()) {
    echo $row[&#39;Name&#39;] . PHP_EOL;
  }
}
$uresult->close();
ログイン後にコピー

非バッファ型クエリ方法 2: pdo_mysql

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", &#39;my_user&#39;, &#39;my_pass&#39;);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
 
$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
  while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
    echo $row[&#39;Name&#39;] . PHP_EOL;
  }
}
ログイン後にコピー

非バッファ型クエリ方法 3: mysql

<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db  = mysql_select_db("world");
 
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
  while ($row = mysql_fetch_assoc($uresult)) {
    echo $row[&#39;Name&#39;] . PHP_EOL;
  }
}
ログイン後にコピー

以上ですこの記事の内容全体が皆さんの学習に役立つことを願っています。


関連する推奨事項:

PHP Yii フレームワークデータベースクエリ操作の概要

MySQL基本的な単純なクエリ、条件付きクエリ、クエリ結果の並べ替え

MySQL データベースクエリ経験の共有XMLの操作について

以上がPHP で非バッファモードを使用してデータベースにクエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート