前段時間有個項目需要生成訂單號,幾年前的做法通常是 當前時間微秒加上隨機數或者uniqid等方式生成。
如下:
$orderNo = date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT); //2020061403291
list($t1, $t2) = explode(' ', microtime()); $time = (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000); $orderNo = $time.rand(100000,999999);
諸如此類都是有概率重復的
即使同一毫秒下 隨機數也是有概率重復的,即使加上商品或者用戶id等。
這里因為php-fpm會有多個進程來處理,加上了進程ID,畢竟同一次創建訂單請求毫秒內處理不完,如果是多台機器可以考慮加上serverid等參數。
list($t1, $t2) = explode(' ', microtime()); $time = (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000); $orderNo = $time.getmypid().rand(100000,999999);
也可以考慮uuid等方式
還有可以生成訂單號去數據庫查詢是否有重復訂單號 這里又涉及到了mysql的事務以及鎖等,下次想明白了在寫。
歡迎討論!