メモリリークとは、プログラムの実行中にメモリが割り当てられるが、使用が完了しても解放されない現象を指します。実行時間が短い通常のプログラムの場合、問題はそれほど明らかではありませんが、長期間にわたって発生します。 -実行中のプログラム たとえば、Web サーバー、バックグラウンド プロセスなどでは、これがより顕著になります。システムが占有するメモリは、システムの実行中に増加し続け、過剰なメモリ使用量によってクラッシュしたり、システムによって強制終了される可能性があります (ああ)。
PHP のメモリ リーク
PHP は高級言語です。言語レベルではメモリの概念がありません。そのため、使用中にメモリを積極的に申請したり解放したりする必要はありません。 PHP ユーザーコードレベル。
PHP プログラムにメモリ リークがある場合、または大きな変数が時間内に解放されない場合は、サードパーティの拡張機能自体の実装に問題があります。
ここでは、nginx+php-fpm モードの動作原理を簡単に紹介します:
nginx サーバーフォーク n 子プロセス (ワーカー)、および php-fpm マネージャーforks n 個の子プロセスを作成します。
ユーザーリクエストがあると、nginxのワーカーがリクエストを受け取り、ソケットにリクエストをスローします。
php-fpm アイドル状態のサブプロセスはソケット内のリクエストをリッスンし、リクエストを受信して処理します。
ここでは、3番目のステップに焦点を当てたいと思います。 3 番目のステップには、php-fpm プロセスのライフサイクルが関係します。 php-fpm のライフサイクルはおおよそ次のようになります。モジュールの初期化 (MINIT) -> モジュールのアクティブ化 (RINIT) -> モジュールの非アクティブ化 (RSHUTDOWN) -> モジュールのアクティブ化 (RINIT) ->リクエスト処理 -> モジュール非アクティブ化 (RSHUTDOWN).... モジュールアクティブ化 (RINIT) -> モジュール非アクティブ化 (RSHUTDOWN) -> モジュールシャットダウン (MSHUTDOWN)。 php-fpm プロセスのライフサイクルには、複数のモジュールのアクティブ化 (RINIT) -> リクエストの処理 -> モジュールの非アクティブ化 (RSHUTDOWN) プロセスが存在します。この「リクエスト処理」の一般的なプロセスは次のとおりです。PHP は対応する PHP ファイルを読み取り、字句解析を実行し、オペコードを生成し、zend 仮想マシンがオペコードを実行します。
PHP設定ファイルのmemory_limitは、実際にはこの「リクエスト処理」のためのメモリのみを制限します。したがって、このパラメータは php-fpm プロセスが占有するメモリとは関係ありません。
では、この問題を防ぐ方法はあるのでしょうか?
php-fpm.conf には、PHP_FCGI_MAX_REQUESTS に相当するパラメータ pm.max_requests があります。この値は、fpm プロセスが自動的に強制終了され、新しいプロセスが開始されるまでに処理するリクエストの数を意味します。
メモリ リークのデバッグとツール
メモリ リークを引き起こすプログラムは、メモリ使用量が継続的に増加することで症状が現れるため、通常は簡単に見つけることができます。メモリ リークが増加し続けていることがわかったら、メモリ リークの原因を特定する必要があります。現時点では、多くの場合、トレースに役立ついくつかのツールの助けを借りて、PHP 組み込みメモリ リーク検出と valgrind メモリ リーク分析の 2 つのツールを使用できます。
関連する推奨事項:
JavaScript のメモリ リークに対処する方法の例を共有する
PHP カーネル - メモリ リークと新しいガベージ コレクション メカニズムの図解による紹介
メモリ リークとは何か、その原因と予防策メモリリークですか?
以上がPHPのメモリリークについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。