【问题标题】:How to generate unique ids for my scaled Servers with PHP?如何使用 PHP 为我的缩放服务器生成唯一 ID?
【发布时间】:2011-02-23 09:16:12
【问题描述】:

我在我的服务器上使用 PHP 函数 uniqid()。它应该是类似微时的东西。所以我认为它对于一台服务器来说是独一无二的。对吗?

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

谢谢

【问题讨论】:

  • $serverId 的东西太明显了。但是我可以为 $serverId 使用什么?
  • 好吧,要么为每台服务器手动配置,要么使用类似uniqid(ip2long($_SERVER['SERVER_ADDR']), true) ...

标签: php scale


【解决方案1】:

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

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

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

毕竟,您可以将其用作某个哈希函数的输入,只是为了规范化为 30 字节字符串(例如,strval() 的输入值串联的 md5sum 的最后 30 个字节)。

【讨论】:

    【解决方案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

    【讨论】:

    • 我可以为 $serverId 使用什么?
    • 查看来自@qbert220 的评论,它说您可以使用服务器的IP 地址或任何其他单独的服务器特定名称/字符串。我更新了上面的示例。
    • 你有'SERVER_ADDR'的替代品吗? IIS 的支持在当时并不重要。如果我打电话给127.0.0.1/test.php 就可以了。如果我打电话给localhost/test.php SERVER_ADDR 在我的本地系统上是 ::1。
    • 您如何识别您的服务器?他们有不同的名字吗?
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        试试

        $uid = uniqid($serverId, true);
        

        这将为每个$uid 加上$serverId 前缀。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          • 2010-12-11
          • 2014-05-26
          • 2013-04-19
          相关资源
          最近更新 更多