English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
データベースから大量のデータをクエリしたときに内容が不足するメッセージが表示されます:
PHP致命的エラー: 許可されたメモリサイズは 268 435 456 bytes exhausted
この問題はPHPの公式ウェブサイトで「バッファリングクエリと非バッファリングクエリ(Buffered and Unbuffered queries)」と呼ばれています。PHPのデフォルトのクエリモードはバッファリングモードです。つまり、クエリデータ結果は一度にすべてメモリに読み込まれ、PHPプログラムで処理されます。これにより、PHPプログラムには追加の機能が提供されます。例えば、行数の計算、ポインタを特定の行に設定などです。さらに重要なのは、データセットに対して二次クエリやフィルタリングなどの操作を繰り返し行うことができます。しかし、このバッファリングクエリモードの欠点はメモリ消費が多いため、速度を犠牲にすることになります。
対照的に、PHPの別のクエリモードは非バッファリングクエリで、データベースサーバーはデータを一つずつ返し、一度に全てを返すのではなく、PHPプログラムが少ないメモリを使用するため、データベースサーバーへの負荷が増加します。なぜなら、データがすべて取得されるまでデータベースがPHPを待つからです。
明らかに、バッファリングクエリモードは小データ量のクエリに適していますが、非バッファリングクエリは大数据量のクエリに適しています。
PHPのバッファリングモードのクエリについては、よく知られていますが、以下の例は非バッファリングクエリAPIの実行方法を示しています。
非缓冲查询方法一: 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['Name'] . PHP_EOL; } } $uresult->close(); ?>
非バッファー 検索方法二: pdo_mysql
<?php $pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); $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['Name'] . PHP_EOL; } } ?>
非バッファー 検索方法三: 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['Name'] . PHP_EOL; } } ?>
これで本文のすべてが終わり、皆様の学習に役立つことを願っています。また、呐喊チュートリアルを多くの皆様にサポートしていただけると嬉しいです。
声明:本文の内容はインターネットから取得しており、著作権者は所有者であり、インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。また、人工編集は行われておらず、関連する法的責任も負いません。著作権侵害を疑う内容がある場合は、メールを notice#w までお送りください。3codebox.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、本サイトは侵害を疑う内容をすぐに削除します。)