Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
92
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@mpyw

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

選択肢

$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);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
92
Help us understand the problem. What are the problem?