選択肢
$fp = fopen('php://memory', 'r+b');
- メモリ上に領域を確保する。メモリリークに注意。
$fp = fopen('php://temp', 'r+b');
- メモリ上に領域を確保し、 2MB を超えたら自動削除される一時ファイルを作る。
$fp = fopen("php://temp/maxmemory:{$n}", 'r+b');
- メモリ上に領域を確保し、
$n
バイトを超えたら自動削除される一時ファイルを作る。
$file = new SplTempFileObject($n);
- 上記の
SplFileObject
版 (継承クラス) 。
引数は省略可能でデフォルトはもちろん 2MB (2 * 1024 * 1024 ) 。 0 にすることも可能。
OOP好きな人はこれでどうぞ。
$fp = tmpfile();
- 自動削除される一時ファイルを作る。
「ファイル」に対してしか操作できない関数を扱う場合はこれが優秀。 - これに限り、
stream_get_meta_data($fp)
で返される配列の'uri'
要素からファイル名を取得出来る 。
tempnam()関数もあるけど、自分でファイルを削除する必要があったりして使いにくい、というか少し用途が違う気がするので割愛。
メモリが解放される・一時ファイルが削除されるタイミングは?
手続き型
-
fclose($fp)
のようにして ファイルポインタを閉じた とき。 - スクリプトが終了した とき。
変数コンテナのように自動的にガーベジコレクションが行われるわけではない。
訂正します。
オブジェクト指向型
- 変数のガーベジコレクションが行われると、自動的にリソースの解放も行われる。
ちなみにPDOもこれに該当するため、いちいち $pdo = null;
などとする必要は基本的には無い。
使用例
cURLのCookieとして用意する
$ch = curl_init();
$meta = stream_get_meta_data($fp = tmpfile());
curl_setopt($ch, CURLOPT_COOKIEJAR, $meta['uri']);
curl_setopt($ch, CURLOPT_COOKIEFILE, $meta['uri']);
繰り返し上記のコードが呼ばれる可能性が場合は後始末が必要
fclose($fp);
curl_close($ch);