2014-09-02 151 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

随机性不是保证唯一文件名的有效方法。由于生日悖论,你会很快得到碰撞。 – 2014-09-02 19:04:29

+0

您可以对日期进行哈希处理并将其设置为文件的名称,因此它不会为其他文件具有相同的名称 – nosthertus 2014-09-02 19:04:49

+0

如果您想要唯一的文件名,请使用'md5_file()'获取文件的哈希值并将其作为名称。或者至少使用像前5-10个字符的东西。有机会,你不会碰到这一点。这样做的好处是,如果你为一个文件命中相同的散列,它最有可能是同一个文件。 – 2014-09-02 19:05:16

回答

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

谢谢。即使没有应用随机命名,这也提供了一个修复解决方案。 – 2014-09-06 07:42:28

相关问题