ホームページ >バックエンド開発 >PHPチュートリアル >PHP カーネル (1) メモリ管理
PHP カーネル (1) メモリ管理
この記事へのリンク: http://www.orlion.ml/tag/php-internal/
1. メモリ管理の基本
使用 C言語で開発する場合、開発者は手動でメモリを管理する必要があります。 PHP は Web サーバーのモジュールとして使用されることが多く、メモリ管理はメモリ リークの防止と密接に関係しています。さらに、PHP はスレッド環境で使用される場合があるため、グローバル変数によって競合状態が発生する可能性があります。さらに、Zend エンジンは非常に特殊な使用パターンに直面しています。比較的短期間に、多くの zval 構造サイズのメモリ ブロックとその他の小さなメモリ ブロックが適用され、その後解放されます。PHP のメモリ管理も、memory_limit を非常に重要視します (制限事項)
上記の要件を満たすために、Zend エンジンはリクエスト関連のデータを処理するための特別なメモリ マネージャーを提供します。リクエスト関連データとは、1 つのリクエストを処理するだけで済み、遅くともリクエストの終了時にリリースされるデータを指します。拡張機能の開発者は主に、以下の表にリストされている規則にさらされますが、提供されている便利な関数の一部はマクロを使用して実装されていますが、この記事では関数と同様に扱います。
前述したように、メモリ リークを防止し、すべてのメモリをできるだけ早く解放することは、メモリ管理の重要な部分です。セキュリティ上の理由から、Zend Engine はリクエストの終了時に上記の API によって割り当てられたすべてのメモリを解放します。 PHP が --enable-debug 構成オプションを使用してビルドされている場合、警告が生成されます
PHP 変数を使用する場合は、変数のメモリが emalloc を使用して割り当てられていることを確認し、参照カウント。
メモリ リーク検出は、emalloc に割り当てられたメモリ ブロックによって引き起こされるリークのみを検出できます。詳細な分析には、valgrind や libumem などのメモリ検出器を使用することをお勧めします。この分析を簡素化するには、PHP の起動時に環境変数 USE_ZEND_ALLOC=0 を設定して、PHP のメモリ マネージャーを無効にします。
(上記は PHP 公式 Web サイトの中国語コンテンツです)
2. データの永続性
データの永続性とは、すべてのデータが現在のリクエストよりも長く存続することが期待されることを意味します。 、Zend エンジンはありません。メモリ マネージャーはリクエストに基づく割り当てを非常に重視しますが、これは通常、実用的または適切ではありません。外部クラス ライブラリの要件を満たすために永続メモリが必要になる場合がありますが、これは便利な「ブラック テクノロジ」でもあります。
永続メモリは通常、永続的なデータベース接続に使用されますが、実際にはあまり良くありませんが、依然として最も一般的に使用される機能です。
注: 追加の永続パラメータを取る以下のすべての関数は false である必要があり、エンジンは通常のアロケーター (emalloc) を使用し、メモリは永続的であると見なされるべきではありません (変換されません!)。永続メモリとして、メイン メモリ API などのシステム コール アロケータは、ほとんどの場合、依然として null ポインタを返しません
警告: 永続化のために割り当てられたメモリは最適ではなく、Zend エンジンによって追跡されていないことに注意してください。さらに、ハッカーが作成したすべての変数をメモリの永続化に使用してはなりません。
(翻訳は本当にひどいです!)