| | ユーザフォーラムで議論/質問 | マニュアル検索 | ハイライト | ハイライトオフ | ポータル | php spot |
基本的なメモリ管理C 言語でのプログラミングでは、開発者がメモリ管理を自分で行う必要があります。 PHP はウェブサーバーのモジュールとして使われることが多いので、 メモリリークを引き起こさないようにメモリ管理が特に重要となります。 さらに注意を要するのは、PHP がスレッド環境で使われる可能性があるということです。 この場合、グローバル変数が競合状態になる可能性があります。 スレッドグローバルなデータの扱いかたについての情報は、 スレッドの分離機能を扱う スレッドセーフなリソースマネージャ のドキュメントを参照ください。 これらに加え、さらに Zend Engine 独特のパターンとして注意しなければならないのは、 比較的短時間の間に zval 構造体やその他の小さなメモリブロックの確保と解放を 頻繁に繰り返すということです。PHP のメモリ管理では、 memory_limit にも注意を払わなければなりません。 これらの要件を満たすために Zend Engine は、 リクエスト単位のデータを処理するための特別なメモリマネージャを提供しています。 リクエスト単位のデータとは、単一のリクエストを処理するためにのみ必要となるデータで リクエストが終了する時点で解放されるものです。 拡張モジュールの作者は、通常は以下の表にあるルーチンを使うだけで済むことになります。 これらは利便性を考慮してマクロとして実装されていますが、 このドキュメントでは関数として扱います。
上でも説明したように、メモリをきちんと管理してメモリリークを防ぐことは非常に大切です。
確保したメモリは、不要になったらすぐ解放するようにしましょう。
安全策として、Zend Engine では、上の API 群で確保したメモリは
リクエストの終了時にすべて解放するようになっています。
例1 PHP のメモリリーク警告 ZEND_FUNCTION(leak)
{
long leakbytes = 3;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &leakbytes) == FAILURE) {
return;
}
emalloc(leakbytes);
}
上の例の出力は、 たとえば以下のようになります。 [Thu Oct 22 02:14:57 2009] Script: '-' /home/johannes/src/PHP_5_3/Zend/zend_builtin_functions.c(1377) : Freeing 0x088888D4 (3 bytes), script=- === Total 1 memory leaks detected ===
|
|
各種マニュアル:
PHPマニュアル |
PEARマニュアル |
Smarty(英語)マニュアル |
PHP-GTKマニュアル |
「基本的なメモリ管理」をGoogle検索
|