文档章节

PHP生成唯一订单号

豆花饭烧土豆
 豆花饭烧土豆
发布于 2016/03/15 02:15
字数 723
阅读 270
收藏 13

在日常的网站开发中,我们经常需要生成唯一的订单号。订单号太短,在高迸发情况下,很容易造成订单号重复事件,虽然是小概率事件。

下面我们使用PHP多个函数生成一个现在最常用的订单号格式:

$order_number = date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

加了毫秒,变成25位了,重复几率更小

$order_number = date('YmdHi'). substr(microtime(), 2, 5) .substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

简单从内到外解析一下这个订单号生成过程:

  1. date("Ymd"):这个很容易理解,是在最前方拼接一个当前年月日组成的数字

  2. uniqid():此函数获取一个带前缀、基于当前时间微秒数的唯一ID。

  3. substr(uniqid(), 7, 13):由于uniqid()函数生成的结果前面7位很久才会发生变化,所以有或者没有对于我们没有多少影响,所以我们截取后面经常发生变化的几位。

  4. str_split(substr(uniqid(), 7, 13), 1):我们将刚刚生成的字符串进行分割放到数组里面,str_split()第二个参数是每个数组元素的长度。

  5. array_map('ord', str_split(substr(uniqid(), 7, 13), 1))):其中array_map()函数作用为:函数返回用户自定义函数作用后的数组,意思就是ord是函数ord(),而后面第二个参数是ord()函数的参数。可以这么理解ord(str_split(substr(uniqid(), 7, 13), 1)))。然后ord()是干啥的,ord()函数php内置函数:返回字符串的首个字符的 ASCII 值,意思就是把第二个参数生成的数组每个元素全部转换为数字,因为刚刚我们截取的字符串中含有字母,不适合订单号。

  6. implode():很简单了,把刚刚那个转换成数字的数字在拼接成为一个数字。

  7. 由于刚刚生成的随机数可能会长短不一(原因就是,每个字符转换为ASCII值可能不一样,有些是2位,有些可能是一位),所以我们同意截取0-8

  8. 然后加上刚刚的日期数字,现在就凑成了一个等长的高大上的订单号了~

转载:http://blog.sina.com.cn/s/blog_68793f6a0102vw09.html

return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);

return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);

//生成24位唯一订单号码,格式:YYYY-MMDD-HHII-SS-NNNN,NNNN-CC,其中:YYYY=年份,MM=月份,DD=日期,HH=24格式小时,II=分,SS=秒,NNNNNNNN=随机数,CC=检查码

@date_default_timezone_set("PRC");

while(true){

//订购日期

 $order_date = date('Y-m-d');

//订单号码主体(YYYYMMDDHHIISSNNNNNNNN)

 $order_id_main = date('YmdHis') . rand(10000000,99999999);

//订单号码主体长度

 $order_id_len = strlen($order_id_main);

 $order_id_sum = 0;

 for($i=0; $i<$order_id_len; $i++){

 $order_id_sum += (int)(substr($order_id_main,$i,1));

}

//唯一订单号码(YYYYMMDDHHIISSNNNNNNNNCC)

 $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);

转载:http://www.thinksaas.cn/group/topic/352944/

© 著作权归作者所有

豆花饭烧土豆

豆花饭烧土豆

粉丝 15
博文 358
码字总数 93985
作品 0
深圳
私信 提问
微信支付-微信红包Java版本

扫描可以关注查看其它接口的demo效果 https://zb.oschina.net/market/opus/1325c0ab3ac1f4b6 代码链接,可根据需求出方案与代码。 需要有认证的公众号,且开通了微信支付,商户平台且开通了现...

小帅帅丶
2016/08/22
6.7K
16
PHP的microtime()的毫秒值会不会有相同的值,能不能拿来做uuid

是这样,想做个时间格式的订单号生成函数,如这样格式:150406223430726653。前面10用时间,后面8位刚好用microtime()生成的毫秒值,请问,microtime()并发的情况下会不会生成相同的值。就是...

键盘浪人
2015/04/07
1K
12
PHP生成订单号算法

首先,订单号不适合用自增字段,因为会暴露一个网站的业务量(参见“德国坦克问题” http://en.wikipedia.org/wiki/Germantank_problem)。另外,通常在订单在写入数据库之前,业务就需要用到...

jims
2016/08/28
0
0
java web系统在高并发和分布式下如何实现订单号生成唯一

方案一:如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间戳正常不同,因此用时间戳+随机数(或自增数)就可以区分各个订单。如果存在并发,且订单号...

刘诗书
2017/11/22
0
0
微信开发之发红包

微信开发之发红包 http://mch.weixin.qq.com/wiki/doc/api/cashcoupon.php?chapter=135 把下面这堆xml 以post请求方式 提交到https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack......

samuel2012
2015/10/23
353
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 常用注解说明

实体类 @Entity (实体类注解) @Table(可指定表名) @Data(可缺省get/set) @Id (指定属性主键) @GeneratedValue(指定主键生成规则)

兜兜毛毛
今天
3
0
局域网能互相ping通,ubuntu虚拟机不能上外网

【问题】 桥接模式老是无法上网,查看本机IP发现被分配了一个私网地址,猜测应该是虚拟DHCP服务器没有打开,于是查看Ubuntu的网络配置: /etc/network/interfaces 发现没有dhcp配置的信息,只...

tahiti_aa
今天
2
0
以太坊助记词PHP开发包简介

以太坊助记词PHP开发包用来为PHP以太坊应用增加助记词和层级确定密钥支持能力。下载地址:以太坊助记词php开发包 。 1、开发包概述 以太坊助记词PHP开发包主要包括以下特性: 生成符合BIP39...

汇智网教程
昨天
2
0
系统监控-分布式调用链Skywalking

1. 为什么要使用分布式调用链技术? 随着公司业务的高速发展,公司服务之间的调用关系愈加复杂,如何理清并跟踪它们之间的调用关系就显的比较关键。线上每一个请求会经过多个业务系统,并产生...

秋日芒草
昨天
6
0
告诉自己的一些建议

摆脱学生心态 尽快发挥自己价值,让公司感知自己的存在,才是王道 选择比努力重要 自己附着的平台的经济体要是一个快速崛起的行业 转行趁早,年龄越大选择成本越高 趁早大量试错,学习新领域...

林怡丰
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部