永远不要重复整数PHP


Never repeating integers PHP

我正在集成一个第三方web服务,该服务要求每次调用都有一个唯一的整数,一旦使用了该整数,它就不会再接受该整数。这将是一个实时集成,即网站上的多个用户可以多次调用该web服务,这意味着如果不止一个用户调用该web service,也可以同时调用。

目前,我尝试了PHP的uniqid()方法为每个事务生成一个唯一的id,但因为它不能保证总是唯一的整数。

此外,我还尝试了UNIX的Epoch seconds作为所需整数,它工作得很好,但我知道它不适用于同时调用。

我不需要随机数,它可以是任何永远不会重复的东西。请提出可能的解决方案。

吨解决方案:

  • 跟踪您的整数(平面文件、带整数键的数据库、自动增量)
  • 防止同时调用(使用锁、信号量等)
  • 使用呼叫队列

创建一个带有自动递增主键的数据库表并使用该数字。为每次呼叫第三方服务插入一行。

更新:

根据你在另一个答案中的评论,我建议使用队列,以便可以重新尝试失败:

对Web服务的调用涉及发送数千美元。如果通话失败,那将是一个非常严重的问题。。。

您的队列可以在一个简单的数据库表中实现,并使用如上所述的主键,也可以使用全面的队列服务。

正如您提到的,您已经尝试过uniqid(),它不会直接生成整数,我假设您需要的可以是一个字符串,您只希望它是唯一的。

这就是UUID的作用,您可以使用类似这样的库或类似这样的更简单方法在PHP中生成它们。

AhUUID实际上是一个128位整数,如果需要,您可以毫不费力地将其转换为十进制。

使用带时间和uniqid的计数器。

 $_SESSION['counter'] += 1;    
 $unique = time() . $_SESSION['counter'] . str_shuffle(rand(100,10000));

如果是32位,则

$uniqMax=pow(2,32);

保存在数据库中,并在唯一代码批准之前检查它是否存在

选项2:使用一个单独的db来创建一个id并根据请求提供它,而不是插入一个带有uniqid 的行