PHPプログラムを作成する際、処理する必要のあるデータが比較的大きい場合、「すべての使用メモリサイズがxxxバイト」という問題がよく発生します。この問題を解決するには、通常、phpの設定を変更する必要があります。 .ini. それは非常に効果的な方法ですが、この問題を解決する他の方法はありますか? ここでは、データベース クエリとファイル読み取りの 2 つの一般的な例からこの問題の解決策について説明します。
この記事で使用したマシン構成はそれほど高くはなく、Ubuntu 14.04 システムです。
既存のコードは次のとおりです:
$sql = "select * from `user` order by `id`"; $conn = mysql_connect($host, $user, $pwd); $db = mysql_select_db($db_name); $result = mysql_query($sql); if ($result) { while ($row = mysql_fetch_assoc($result)) { // 一些操作的代码 } }
案の定、私が特別に構成した低メモリ実行環境では、「許容メモリ サイズ xxx バイト」の問題が発生しました。
元のコードの処理では、最初にすべてのデータをメモリに読み込んでから、データが設定された最大メモリを超えると、このプロンプトが表示されます。
1 つは、上記のような
cacheクエリです。もう 1 つは、必要なデータのみを処理するものと似ています。処理されるデータはキャッシュされるため、サーバーの負荷は多少増加しますが、メモリ内である程度の最適化が行われます。 たとえば、上記の例では、
memory_get_usage();functionを使用して、18973784バイトのメモリ使用量を取得しました。以下に 3 つの書き込み方法とそのインターセプトされたメモリ使用量を示します。この比較はあまり正確ではないかもしれませんが、主にアイデアを提供し、出発点として役立ちます。 コード 1:
$conn = mysql_connect($host, $user, $pwd); $db = mysql_select_db($db_name); $result = mysql_unbuffered_query($sql); if ($result) { while ($row = mysql_fetch_assoc($result)) { // 一些处理 } }
これと例の違いは、mysql_unbuffered_query 関数の計算されたメモリ フットプリントが 27392 バイトであることです。
コード 2:
$pdo = new PDO("mysql:host={$host};dbname={$db_name}", "{$user}", "{$pwd}"); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $result = $pdo->query($sql); if ($result) { while ($row = $result->fetch(PDO::FETCH_ASSOC)) { // 一些处理的代码 } }
コード 2 は pdo を使用し、計算されたメモリ使用量は 33672 バイトです
コード 3:
$mysqli = new mysqli("{$host}", "{$user}", "{$pwd}", "{$db_name}"); $result = $mysqli->query("{$sql}", MYSQLI_USE_RESULT); if ($result) { while ($row = $result->fetch_assoc()) { // 一些操作的代码 } }
コード 3 は mysqli を使用し、メモリ使用量は 9008 バイトです
添付ファイル: メモリ使用量のテスト方法
$start = memory_get_usage(); // 操作代码 $end = memory_get_usage(); $used = $end - $limit; echo $used;
上記は、PHP エラーの内容です: 許可されたメモリ サイズは xxx バイトです (1) さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。