2014-09-02 5 views
1

Я использую функцию случайных чисел в скрипте PHP при загрузке файлов. Потому что я хотел избежать перезаписи файлов с тем же именем. Итак, при загрузке файла используется зелье скрипта.PHP, генерирующий одно и то же случайное число в одно и то же время (в секундах)

$filename = rand(0,100000).strtolower($_FILES['file']['name']); 
$dir="/file/upload/directory/".$filename; 
move_uploaded_file($_FILES["user_file"]["tmp_name"], $dir); 

В этом приложении ожидается большое количество одновременных пользователей. Таким образом, QA тестирует это приложение с помощью различных автоматизированных инструментов, применяя высокий одновременный визит. Это указывает на то, что случайное число создает одинаковое значение за одни и те же секунды.

Затем мы проверяем случайное число отдельно, это же случайное число в то же время было четко идентифицировано.

В то время как поиск в Интернете какой-либо пост предлагает на mt_rand(), но все равно он на милли-втором уровне.

Есть ли способ генерации случайного числа во времени независимо от способа в PHP?

+3

randomness НЕ является действительным способом гарантировать уникальные имена файлов. Вы получите очень быстро столкновения из-за парадоксальности дня рождения. –

+0

Вы можете указать дату и установить его как имя файла, поэтому он не будет иметь то же имя для других файлов. – nosthertus

+0

Если вы хотите уникальные имена файлов, используйте 'md5_file()', чтобы получить хэш файла и сделать это имя , Или, по крайней мере, используйте что-то вроде первых 5-10 символов. Скорее всего, вы не столкнетесь с этим. Преимущество этого в том, что если вы нажмете один и тот же хеш для файла, скорее всего, тот же файл. –

ответ

0

Произвольные числа генерируются с течением времени. Но для этой конкретной проблемы нам нужно написать несколько строк кода. Если мы проверим существование файла и применим инкрементный номер к имени файла, это будет фиксированное решение. Код может выглядеть следующим образом.

$filename = strtolower($_FILES['file']['name']); 
$dir="/file/upload/directory/"; 
$i = 1; 

while(is_file($dir . $i . $filename)) 
{ 
    $i++; 
} 

move_uploaded_file($_FILES["user_file"]["tmp_name"], $dir . $i . $filename); 

Хотя цикл неэффективен. Это позволит убедиться, что перезапись файла не произойдет.

+1

Спасибо. это дает исправление, хотя случайное именование не применяется. –

Смежные вопросы