ホームページ  >  記事  >  バックエンド開発  >  PHP プロセスのメモリ オーバーフローを防ぐためのトラブルシューティング

PHP プロセスのメモリ オーバーフローを防ぐためのトラブルシューティング

藏色散人
藏色散人転載
2020-06-24 13:42:112451ブラウズ

PHP プロセスのメモリ サイズを設定できます。デフォルトは設定ファイルにあります。memory_limit=128M

プログラム内で動的に設定することもできます。 ini_set('memory_limit', '1024M');これにより、1G に設定されます。ただし、この設定はマシンの他のサービスに影響を与えるため、通常は行われません。コードを確認できる場合もありますが、多くの場合、メモリ オーバーフローは、PHP 変数が時間内に解放されなかったり、比較的大きな配列を走査したりしたときに発生します。

1. トラブルシューティング

memory_get_usage() PHP には、現在のプロセスによって使用されているメモリ空間の量を取得するこのシステム関数があります。戻り値はバイト単位 round(memory_get_usage()/1024/1024, 2).'MB' で、追跡するために MB.

に変換できます。コード実行プロセスのメモリが変更されます。

2. 一般的なメモリ オーバーフローのケース

大きな配列を走査し、配列の一部の値を変更すると、走査プロセス中に配列のコピーが作成されます。

PHP 変数の特徴は「コピーオンライト」です。

$arr 配列の代入に関しては、分割されて新しい HashTable 構造が生成され、メモリ使用量が発生します。 Big

3. トラバースして他の変数を割り当てる

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
foreach($arr as $key => $item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}
echo &#39;foreach后内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

//输出
/*
foreach前内存:49.9MB
foreach中内存:81.36MB
foreach中内存:84.42MB
foreach中内存:87.47MB
foreach中内存:90.52MB
foreach中内存:93.57MB
foreach中内存:96.62MB
foreach后内存:49.9MB
*/

解決策は、参照トラバーサルを使用することです

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

foreach($arr as $key => &$item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}unset($key);unset($item);

走査が完了したら、忘れずに unset($key);unset($item); $item は配列の最後の要素への参照であるため、後でこの変数を変更すると、配列に直接変更できます。

推奨: 「PHP ビデオ チュートリアル

以上がPHP プロセスのメモリ オーバーフローを防ぐためのトラブルシューティングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。