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 エンジンによって追跡されていることに注意してください。制限されていません。さらに、ハッカーが作成したすべての変数をメモリの永続化に使用してはなりません。
(翻訳は本当にひどいです!)
上記では、PHP カーネルとメモリ管理についてその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。