ホームページ  >  記事  >  データベース  >  PHP が mysql_query を使用して非常に大きな結果セットをクエリする場合の過剰なメモリ問題を解決する方法

PHP が mysql_query を使用して非常に大きな結果セットをクエリする場合の過剰なメモリ問題を解決する方法

黄舟
黄舟オリジナル
2016-12-13 17:56:391008ブラウズ

Mysql クエリには別のクエリ メソッドも用意されており、関数名は mysql_unbuffered_query です。この関数は結果を見つけた直後に結果セットを使用し、結果セットをメモリにキャッシュしないため、メモリ超過の発生が回避されます。ただし、このメソッドを使用すると、クエリ時に結果が返されるため、クエリ時に本社を取得するなどのメソッドが使用できないというデメリットがあります。同時に、この方法を使用する場合、同じデータベース リンク上で他の操作を実行することはできません。他の操作を実行する場合は、まず現在の操作を終了するか、キャッシュされていない SQL クエリによって生成されたすべての結果行を解放するか、再インスタンス化する必要があります。データベースに接続し、他のアクションに新しいリンクを使用します。

以下は、キャッシュを使用する場合とキャッシュを使用しない場合の比較です (クエリされたテーブルには 1,000 万行を超えるデータがあります):

function selecttest()
{
try {
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');
// 不使用缓存结果集方式
// $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo->prepare('select * from test');
$sth->execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth->fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i > 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
}
} catch (Exception $e) {
echo $e->getMessage();
}
}

上記で使用される方法は、この関数を実行するときにすべての結果セットをキャッシュすることです。例外は次のように報告されます:

致命的なエラー: E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstest.php の 57 行目で、許容メモリ サイズ 134217728 バイトが使い果たされました (204800000 バイトを割り当てようとしました)。

Call Stack:

0.0005 135392 1. { main}() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:0
0.0005 135568 2. test->selecttest() E:ProgramDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:86
0.0055 142528 .PDOStatement->execute() E:プログラムDevelopmentRuntimeEnvironmentxampphtdocstesttest.php:57

$sth->execute();; の実行時にメモリ制限を超えました

コメント // $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); を削除しますこの関数を実行すると、次の結果が出力されます:

初期占有メモリ サイズ: 144808

Array
(
[id] => 1
[a] => v
[b] => w
[c] => i
)

占有メモリ サイズ: 145544

Array
(
[id] => 2
[a] => b
[b] => l
[c] => q
)

占有メモリ サイズ: 145544

Array
(
[id] => 3
[a] => m
[b] => p
[c] => h
)

占有メモリ サイズ: 145536

Array
(
[id] => 4
[a] => j
[b] => i
[c] => b
)

占有メモリサイズ:145536

Array
(
[id] => 5
[a] => q
[b] => g
[c] => g
)

占有メモリサイズ:145536

結果セットをキャッシュせずに結果の行を取得することで占有されるメモリが非常に小さいことがわかります。これにより、メモリ制限を超える問題が解決されます。

お読みいただきありがとうございます。さらに関連コンテンツを入手したい場合は、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。