関連する学習に関する推奨事項: php プログラミング(ビデオ)
最近、PHP プログラムの開発中に次のエラーが発生しました:
エラー メッセージは、最大許容メモリが使い果たされたことを示しています。最初はこのようなエラーが発生したことに驚きましたが、よく考えてみると、私が開発しているプログラムでは 40,000 件のレコードを持つテーブルでPHP 致命的なエラー: 許可されたメモリ サイズ 268 435 456 バイトが使い果たされました
foreach ループ ステートメントが使用されているため、それは驚くべきことではありません。特徴のあるデータの場合は、一度に4万件のデータを取り出し、毎日のデータを一つ一つ確認する必要があります。 40,000件のデータをすべてメモリにロードした場合、メモリがバーストしなくても不思議ではないと考えられます。
<?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(); ?>
<?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; } } ?>
<?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; } } ?>
これはジェネレーターを使用する必要がありますこの書き方は直接開くことができますこれはビッグデータを処理するのは不可能 その書き方によると
PHP中国ネットユーザーXiao Chen氏が正しい方法を教えてくれました
<?php if (!function_exists('getYieldBigData')) { /** * 使用生成器返回生成器对象 * @param array $data * @return Generator */ function getYieldBigData($data = []) { foreach ($data as $tmp_data) { yield $tmp_data; } unset($tmp_data); } } if (!function_exists('foreachBigData')) { /** * 循环大量数据使用生成器来制造值 * @param array $data * @return array|false */ function foreachBigData($data = []) { if (0 == count($data)) { return false; } $tmp = []; foreach (getYieldBigData($data) as $v) { $tmp[] = $v; } unset($v); return $tmp; } } //调用方法 /** * @var $data array */ $data = []; /** * @var $ret array */ $ret = foreachBigData($data); return $ret;
初心者でも読めるようになりましたそれ!
#上記のように、この方法では 100 万回/回に到達する可能性があります。 この記事は、php 中国語 Web サイトのphp graphictutorial チャネルからのもので、原著者: God of War Wukong (php 中国語 Web サイトの 2 番目の編集者) です。
以上がPHPで大量のデータをループするときにメモリが枯渇する問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。