データの永続化

ここでいう「データの永続化」とは、現在のリクエストの間はずっと生き続けることを想定したあらゆるデータを指します。 エンジン内でのメモリ管理はリクエスト単位での割り当てを重視していますが、必ずしもこれが現実的であったり適切であったりするわけではありません。 永続メモリは、たとえば外部ライブラリの要件を満たすために必要になることがあります。 また、ハックの際にも便利です。

永続メモリのよくある使い道は、データベースサーバーとの持続的な接続をできるようにすることです。 これはあまり望ましいことではありませんが、永続メモリの使い道としては一番よくあるものです。

注意: これらの関数にはすべて、追加のパラメータ persistent があります。これを false にすると、 エンジンは通常のアロケータ (emalloc) を使い、永続化しなくなります。メモリを永続化する場合はシステムのアロケータを使います。 しかしたいていの場合、メインメモリ API のように NULL ポインタを返すことはできません。

永続メモリ API
プロトタイプ 説明
void *pemalloc(size_t size, zend_bool persistent) size バイトのメモリを確保します。
void *pecalloc(size_t nmemb, size_t size, zend_bool persistent) size バイトのバッファを nmemb 要素だけ確保し、 ゼロで初期化します。
void *perealloc(void *ptr, size_t size, zend_bool persistent) emalloc を使って確保したバッファ ptr のサイズを変更し、 size バイトにします。
void pefree(void *ptr, zend_bool persistent) ptr が指すバッファを解放します。このバッファは pemalloc で確保したものでなければいけません。
void *safe_pemalloc(size_t nmemb, size_t size, size_t offset, zend_bool persistent) size バイトのバッファを nmemb ブロックぶんと、さらに offset バイトを確保します。 pemalloc(nmemb * size + offset) と似ていますが、 オーバーフロー対策の特別な保護が追加されています。
char *pestrdup(const char *s, zend_bool persistent) NULL 終端文字列 s を保持できるだけのバッファを確保し、 s をそのバッファにコピーします。
char *pestrndup(const char *s, unsigned int length, zend_bool persistent) pestrdup と似ていますが、NULL 終端文字列の長さが既知である場合に使います。
警告

大切なのは、永続化させるために確保したメモリはエンジン側での最適化や追跡が行われないということです。 memory_limit に縛られることもありません。さらに、エンジンのハッカーが作った変数では永続メモリを使ってはいけません。