php生成訂單號 如何防止重復?


 

前段時間有個項目需要生成訂單號,幾年前的做法通常是 當前時間微秒加上隨機數或者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的事務以及鎖等,下次想明白了在寫。

 

歡迎討論!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM