ホームページ  >  記事  >  バックエンド開発  >  PHP エラー: 許容メモリ サイズは xxx バイトです (1)

PHP エラー: 許容メモリ サイズは xxx バイトです (1)

PHP中文网
PHP中文网オリジナル
2017-03-30 17:14:311135ブラウズ

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) に注目してください。

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