uiuifree.com

- サイト制作のノウハウと最適化を目指して-

2019.12.15【PHP】自動削除される一時ファイルを作れるtmpfileメソッドが便利

【PHP】自動削除される一時ファイルを作れるtmpfileメソッドが便利

PHPで重複しないファイル名で一時ファイルを作成し、処理が終了したら自動的に削除する関数tmpfile()を紹介します。

利用例

  • ・S3やファイルサーバーのデータを毎回読み込むのは遅いのでWEBサーバーにコピーして処理して削除したい。
  • ・サイトマップ作成などCSVファイルを数分処理するが、そのファイルをアップロードしたら消したい。

上記の仕様に対して日付別のtmpフォルダを作り、一時ファイルを作成して必要なくなれば削除する。そんな処理をカタカタ書いてもっとスマートに処理できないかな?と開発していた時期が私にもありました。

PHPでは一時ファイルを作ってfcloseやスクリプト処理が終了したタイミングで削除するtmpfile() が用意されています。

リファレンス

リファレンス
tmpfile ( void ) : resource
書き込み可のモード (w+) でユニークな名前を有するテンポラリファイルを作成し、 ファイルハンドルを返します。 (fclose()を呼んだり、tmpfile() が返すファイルハンドルへの参照がなくなったりして) ファイルをクローズした場合や、スクリプトが終了したりしたときに、このファイルは自動的に削除されます。 (参照元:php.net)

ファイル書き込みのサンプルコード

sample.php
<?php $file = tmpfile(); fputcsv($file,['id','user']); rewind($file); var_dump(fgetcsv($file));
実行結果
array(2) { [0]=> string(2) "id" [1]=> string(4) "user" }

簡単に作れましたね。

実態のファイルはどこに?

tmpfile()は、メモリ上に作られてるわけでなく物理サーバーのファイルとして作られます。
そのため書き込める上限は当然ながらサーバー容量が限界となります。

サンプル
$file = tmpfile() $meta = stream_get_meta_data($file); var_dump($meta[‘uri’]);
実行結果
string(66) "/tmp/php4Ysgga"

uriに記述されている /tmp/php4Ysgga が一時ファイルの保存パスになります。
(実行すると結果は毎回変わります。)

PROFILE

このサイトを運営してるuiuifreeです。
渋谷のベンチャー企業で2年ほど新規事業を担当した後にフリーランスエンジニアにキャリア転換。
求人サイトの開発が多くエンジニア/飲食店/看護師/保育士などの分野でサイトを運営しています。

アウトプット中の技術

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)