基本的なメモリ管理
スレッドセーフなリソースマネージャ
メモリ管理
PHP Manual

## データの永続化

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

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

> 注意: これらの関数にはすべて、追加のパラメータ 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 に縛られることもありません。さらに、エンジンの`ハッカー`が作った変数では永続メモリを使ってはいけません。

基本的なメモリ管理
スレッドセーフなリソースマネージャ
メモリ管理
PHP Manual