ホームページ  >  記事  >  バックエンド開発  >  PHPのメモリリークが起こると何が起こるのでしょうか?

PHPのメモリリークが起こると何が起こるのでしょうか?

王林
王林オリジナル
2019-09-20 11:53:183348ブラウズ

PHPのメモリリークが起こると何が起こるのでしょうか?

状況 1. プログラム動作データが大きすぎます

シナリオ復元: 1 回の読み込みが上限を超えていますPHP の使用可能なメモリの制限 データによりメモリが不足します

<?php
ini_set(&#39;memory_limit&#39;, &#39;128M&#39;);
$string = str_pad(&#39;1&#39;, 128 * 1024 * 1024);

解決策:

1. お金で解決できる問題は問題ではありません。プログラムが大きなファイルを読み取る必要がある場合、機会はそれほど多くなく、上限が予測可能である場合は、ini_set('memory_limit', '1G'); を使用してより大きな値、またはmemory_limit=-1を設定します。十分なメモリがある場合は、プログラムを実行し続けることができます。

2. プログラムをメモリの小さいマシンで正常に使用できるようにする必要がある場合は、プログラムを最適化する必要があります。以下に示すように、コードはさらに複雑です。

<?php
 //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 
require "vendor/autoload.php";
 ini_set(&#39;memory_limit&#39;, &#39;128M&#39;); 
//生成临时文件存放大字符串 
$fileName = &#39;tmp&#39;.bin2hex(random_bytes(5)).&#39;.txt&#39;; touch($fileName);

for ( $i = 0; $i < 128; $i++ ) {    
    $string = str_pad(&#39;1&#39;, 1 * 1024 * 1024);
    file_put_contents($fileName, $string, FILE_APPEND); 
} 
$handle = fopen($fileName, "r"); 
for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) {   //do something   
    $string = fread($handle, 1 * 1024 * 1024); 
} 
fclose($handle); 
unlink($fileName);

状況 2プログラムがビッグ データを操作するときにコピーが生成される

シナリオ復元: シナリオ復元中の大きな変数実行 コピーが作成されたため、メモリが不足しました。

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
$string2 .= &#39;1&#39;;

解決策:

無駄な変数を早めに解放するか、元のデータを参照形式で操作します。

<?php 
ini_set("memory_limit",&#39;1M&#39;); 
$string = str_pad(&#39;1&#39;, 1* 750 *1024); 
$string2 = $string; 
unset($string); 
$string2 .= &#39;1&#39;;

シナリオ 3. 無理な構成とシステム リソースの枯渇

シナリオ復元: 無理な構成によるメモリ不足、2G メモリのマシン 上記の設定最大 100 個の php-fpm サブプロセスを開始できますが、実際に 50 個の php-fpm サブプロセスを開始した後は、それ以上のプロセスを開始できなくなります。

解決策:

post_max_size、max_file_uploads、upload_max_filesize、max_input_vars、max_input_nesting_level などのパラメータを適切に設定し、php-fpm 関連のパラメータを調整します。

状況 4. 役に立たないデータが期限内にリリースされない

シナリオの復元: この問題は、シナリオから論理的ではありません。プログラム ロジック 問題があるが、無駄なデータが多くのメモリを占有し、リソース不足につながるため、対象を絞ったコードの最適化を行う必要があります。

次のコードは、Laravel 開発でデータベース操作を監視するために使用されます:

DB::listen(function ($query) {            
// query−>sql//query−>sql//query->bindings            
// $query->time        });

解決策:

この場合、DB を渡します。 ::listen メソッドは、実行されたすべての SQL ステートメントの記録を取得し、ログに書き込みます。ただし、このメソッドにはメモリ リークの問題があります。開発環境では問題ありません。運用環境では、これを無効にする必要があり、他のメソッドは無効になります。実行された SQL ステートメントを取得して書き込むために使用されます。ログ。

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

以上がPHPのメモリリークが起こると何が起こるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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