如何在不检查db的情况下在php中生成唯一的序列号或订单号?
答案 0 :(得分:5)
在uniqid或uuid pecl或com_create_guid()
中查看{{3}}或uuid_create
答案 1 :(得分:1)
如果您想保证唯一性,那么您必须检查某些内容。您可以使用平面文件并仅存储最近使用的数字(然后可以增加),但是不使用数据库是愚蠢的。您需要存储与该号码相关联的一堆其他信息(联系方式,订单包含的内容等),数据库是理想的。
答案 2 :(得分:1)
在mysql中使用自动增量列有几个问题(尤其是它不能扩展到等效节点)。
虽然你可以在几乎任何地方维护一个序列生成器(memcache,文件,数据库),但PHP并没有实现复杂的文件锁定语义 - 除了影响性能之外,你还可以快速进入交易锁定情境。它不能扩展到大容量。
如果你有PL / SQL可用,那么我建议在那里实现一个序列生成器 - 或者你可以考虑在PHP和sqlite中实现一个生成器。
我强烈建议您实施生成器以创建格式数:
$ use_number = ++ $ sequence_number。 str_pad($ node_id,'0',$ max_nodes,STR_PAD_LEFT);
其中node_id是唯一引用存储当前序列号的存储基板的编号。并且$ max_nodes有点多于$ node_id中找到的最大位数(例如3个节点允许最多999个节点)。
或者将其视为带有2个部分之间标点符号的字符串(和/或将2个部分存储在不同的数据库列中)。
下进行。
答案 3 :(得分:0)
如果您使用的是MySQL数据库,则可以生成序列号,而无需使用auto_increment列预先检查数据库。插入新行将导致为该列分配新的唯一ID,而无需在PHP中读取/写入该列。
或者,如果您想要一个甚至没有数据库的全局唯一ID,那么您可以使用PHP的uniqid()函数。请注意,这会返回一个字符串。如果您使用多台物理计算机或在服务器之间移动,则应在每台计算机上添加不同的前缀(第一个参数)。在同一台机器上使用时,此函数永远不应返回相同的字符串值两次。