LoginSignup
91
94

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-09-18

選択肢

$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);
91
94
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
91
94