2010年11月3日水曜日

PHPで一時的なファイルを作成するときに、ファイル名の重複がないようにする

テンポラリファイルを作成して後で利用する処理などの場合、ファイル名が同じだとテンポラリファイルが上書きされてしまうかもしれない。
そのときの時分秒をファイル名に使用しても、重複する可能性はある。

ファイル名の重複を避ける便利な関数がある
tempnam関数を使えばよい。
この関数は、重複しないファイル名でサイズ0バイトのファイルを生成する。
返り値は生成したファイル名。
どういう原理で重複を避けてるのか。。

パフォーマンスへの影響は?
tempnam関数を使ってファイルを生成→削除した場合と、使用しないで生成→削除した場合の比較してみる。
PHP 5.2.5を使っています。

tempnam関数を使った場合
$time_start = microtime();
for($i = 0; $i < 1000; $i++){
 $filename = tempnam($dir, $prefix);
 unlink($filename);
}
$time_end = microtime();

上のようなサンプルを書いて試した(主要な部分のみ抜粋)。
tempnam関数を使ってファイル生成→削除を1000回ループまわしています。
10回試して平均した結果。
4.3750467(秒)

tempnam関数を使わない場合
$time_start = microtime();
for($i = 0; $i < 1000; $i++){
 $fp = fopen($dir.$prefix, "w");
 fclose($fp);
 unlink($dir.$prefix);
}
$time_end = microtime();

単純にファイル生成→削除を1000回ループまわしています。
10回試して平均した結果。
2.738844(秒)

1.5倍くらい違うという結果になった
tempnam関数を使用すると1.5倍くらい遅くなる、という結果になった。
そこまで劇的には変わらないようです。

でもどういう原理なんでしょうねー。

0 件のコメント:

コメントを投稿


Related Posts Plugin for WordPress, Blogger...