如何使用PHP为已缩放的服务器生成唯一ID?
我正在服务器上使用PHP函数uniqid()。应该是微时间。所以我认为它对于一台服务器来说是独一无二的。对吗 如果使用负载平衡器扩展服务器,如何获得唯一id?我需要一个少于31个字符的字符串如何使用PHP为已缩放的服务器生成唯一ID?,php,scale,Php,Scale,我正在服务器上使用PHP函数uniqid()。应该是微时间。所以我认为它对于一台服务器来说是独一无二的。对吗 如果使用负载平衡器扩展服务器,如何获得唯一id?我需要一个少于31个字符的字符串 谢谢您应该将前缀设置为唯一的字符串(每个服务器的唯一性是您的系统)。例如主机名或IP地址。将该值保持在17个字符以下(如果使用额外的熵,则为7个)。是的,正如它所说,它基于当前时间(以微秒为单位) 您可以使用prefix参数传入主机特定的前缀 即使使用more\u entropy参数,前缀仍有7个字符,允许
谢谢您应该将前缀设置为唯一的字符串(每个服务器的唯一性是您的系统)。例如主机名或IP地址。将该值保持在17个字符以下(如果使用额外的熵,则为7个)。是的,正如它所说,它基于当前时间(以微秒为单位) 您可以使用
prefix
参数传入主机特定的前缀
即使使用more\u entropy
参数,前缀仍有7个字符,允许使用256**7台主机。试试看
$uid = uniqid($serverId, true);
这将为每个$uid
加上$serverId
前缀。对于作为第一个参数传递的每个服务器,可以使用带有不同前缀的uniqid()
string uniqid([string$prefix=”“[,bool$more\u entropy=false]])
前缀
例如,如果生成标识符,则可能非常有用 同时在多个主机上 可能会产生 相同微秒的标识符。
如果前缀为空,则返回 字符串长度为13个字符。如果 如果熵越大,则为23 人物 例如:
$serverId = str_replace('.', '', $_SERVER["SERVER_ADDR"].$_SERVER["SERVER_PORT"]);
$uid = substr(uniqid($serverId, true), 0, 30);
或者查看这个伟大的uuid()函数:我建议组合多个熵源。这样,您就不会依赖于某些假设(本地IP地址不同)或运气(两台服务器不会在同一时间做完全相同的事情) 我想到的东西(非常便携,不是特定于平台的):
- 纳米时代
- 打开并计算其中的文件大小
- 当前脚本的文件系统日期戳
- 运行一个简单的无操作循环并计算其持续时间
毕竟,您可以将其用作某个哈希函数的输入,只需将其规格化为30字节的字符串(例如,输入值的
strval()
串联的md5sum的最后30字节)。使用$serverId的事情非常明显。但是我可以为$serverId使用什么呢?好吧,为每台服务器手动配置它,或者可能使用类似于uniqid的东西(ip2long($\u server['server\u ADDR']),true)
…我可以为$serverId使用什么呢?请参阅@qbert220的注释,它表示您可以使用服务器的ip地址或任何其他特定于服务器的名称/字符串。我更新了上面的示例。您有“服务器地址”的替代方案吗?目前对IIS的支持并不重要。如果我打电话就可以了。如果我调用本地系统上的服务器\ u ADDR is::1,您如何识别您的服务器?他们有不同的名字吗?