我正在集成第三方Web服务,每次调用都需要一个唯一的整数,一旦消耗掉整数,它就不再接受该整数。它将是一个实时集成,即,可以从网站上的多个用户多次调用该Web服务,这意味着如果多个用户调用该Web服务,也可以同时进行调用。
现在我尝试使用PHP的uniqid()
方法为每个事务生成一个唯一的id,但因为它不能保证唯一的整数。
此外,我尝试了UNIX的Epoch秒作为必需的整数,它完美地工作但我知道它不适用于同时调用。
我不需要随机数字,它可以是任何永远不会重复的数字。请提供可能的解决方案。
答案 0 :(得分:3)
大量的解决方案:
答案 1 :(得分:2)
使用自动递增主键创建数据库表并使用该数字。为每次调用第三方服务插入一行。
根据你在另一个答案中的评论,我建议使用一个队列,以便重新尝试失败:
对网络服务的呼吁涉及发送数千美元。如果通话失败,那将是一个非常严重的问题......
您的队列既可以在简单的数据库表中实现,也可以使用上面提到的主键,也可以使用完整的队列服务。
答案 2 :(得分:2)
正如你所提到的那样,你已经尝试了uniqid()
,它没有直接产生一个整数,我认为你需要的可以是一个字符串,你只希望它是唯一的。
这就是UUID的用途,你可以使用像this这样的库或像this这样的简单方法在PHP中生成它们。
啊UUID实际上是一个128位整数,如果需要,你可以稍微努力将它转换为十进制。
答案 3 :(得分:0)
使用带时间和uniqid的计数器。
$_SESSION['counter'] += 1;
$unique = time() . $_SESSION['counter'] . str_shuffle(rand(100,10000));
如果是32位,那么
$ uniqMax = pow(2,32);
保存在数据库中并在唯一代码批准之前检查它是否存在
选项2:使用创建id的单独数据库并根据请求提供它,而不是插入带有uniqid的行