Edited at

PHPで一時的なファイルポインタを扱う方法

More than 5 years have passed since last update.


選択肢


$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);