如何使用PHP为我的缩放服务器生成唯一ID?

时间:2011-02-23 09:16:13

标签: php scale

我在我的服务器上使用PHP函数uniqid()。它应该像微缩时间一样。所以我认为它是唯一的FOR ONE服务器。这是对的吗?

如果使用负载均衡器扩展我的服务器,如何获得唯一ID?我需要一个少于31个字符的字符串。

由于

5 个答案:

答案 0 :(得分:2)

对于作为第一个参数传递的每个服务器,您可以对uniqid()使用不同的前缀。 Check the documentation

  

string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )

     

prefix
  例如,如果您生成标识符,则可能很有用   同时在几个主机上   可能碰巧生成了   标识符在相同的微秒   使用空前缀,返回   字符串长度为13个字符。如果   more_entropy为TRUE,它将为23   字符。

示例:

$serverId = str_replace('.', '', $_SERVER["SERVER_ADDR"].$_SERVER["SERVER_PORT"]);
$uid      = substr(uniqid($serverId, true), 0, 30);

或者查看这个伟大的uuid()函数:http://cakebaker.42dh.com/wp-content/uploads/2007/01/uuid_component_2007-01-24.zip

答案 1 :(得分:2)

我建议组合多个熵源。这样你就不会依赖某些假设(本地IP地址不同)或运气(两台服务器不会在同一纳米时间完全相同)。

我想到的事情(并且非常便携,而不是特定于平台):

  • nanotime,
  • 打开temp directory in file system并计算文件大小,
  • 当前脚本的文件系统日期时间戳,
  • 运行一个简单的无操作循环并计算其持续时间,
  • ...

毕竟你可以使用它作为一些散列函数的输入,只是为了规范化为30字节的字符串(例如输入值为strval()的md5sum的最后30个字节)。

答案 2 :(得分:1)

是的,正如其manual page所说,它基于当前时间(以微秒为单位)。

您可以使用prefix参数传入特定于主机的前缀。

即使使用more_entropy参数,前缀仍有7个字符,允许256 ** 7个主机。

答案 3 :(得分:0)

您应该将前缀设置为唯一字符串(每个服务器对您的系统都是唯一的)。示例可以是主机名或IP地址。保持少于17个字符(如果使用额外的熵,则为7个字符)。

答案 4 :(得分:-1)

尝试

$uid = uniqid($serverId, true);

这将为每个$uid添加前缀$serverId