PHPのtempnam()関数

tempnam

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();

時分秒まで加えればさらに安心。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

投稿ナビゲーション