tempnam()関数。一時ファイル名を生成する関数ですが、ファイルのアップロードを行う際などに、よく使います。
しかし、このtempnam()関数は、環境がWindows + Apache + PHPの場合、正しく動作しません。
例えば、
$tmp = tempnam('./',date("Ymd")."_");
このように指定すると、普通は「20121213_zNaT8G」のように作られるのに、Windows環境だと「20182DF.tmp」のように、接頭語が日付の形式にもなっていないし、「_(アンダーバー)」も入っていないし、ましてや最後に「.tmp」って拡張子まで付いてる・・・もはや使い物になりません。
それならということで、関数を作って、自前で一時ファイル名を作った方がいいんじゃないかと。
// 一時ファイル名生成関数 function tempName($len=8){ // ファイル名で使う文字列を指定 $str = "23456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ"; // 文字数を取得 $num = strlen($str); $tmp = ""; // 引数で指定した分だけ繰り返し for($i = 0; $i < $len; $i++){ // 0~文字数-1の数字からランダムで選択 $index = rand(0, $num-1); // 文字列からランダムで指定した位置の一文字を取得して連結 $tmp .= substr($str, $index, 1); } // 生成した文字を返す return $tmp; }
これで、指定した文字数を返してくれるので、あとは
$tmp = date("Ymd")."_".tempName();
とすれば、同じような一時ファイル名が返ってくるはず。
tempnam()のように、ディレクトリ内で重複しない様にチェックはしていないけど、日付とランダム文字列の組み合わせなら、よほどアクセスのあるシステムでもない限り重複はないでしょ。
それでも気になるなら、さらに
$tmp = date("YmdHis")."_".tempName();
時分秒まで加えればさらに安心。