UUID 已經使用了很多年並且存在多種生成方法。
我更喜歡 PECL 擴展而不是 ramsey/uuid
包,因爲它更的簡單明瞭。數週前,我們有了將 PECL 擴展移植到純 PHP 的想法,與 Nicolas Grekas 一起,我們將其發佈爲 Symfony Polyfill。然後,我們想寫博客介紹 FFI 這一 PHP 7.4 的新功能。因此,與 Baptiste Leduc 一起,我們將 libuuid
庫與 PHP 進行了綁定。
因此,現在至少有四種方法可以用 PHP 生成 UUID,讓我們進行對比:
- PECL 擴展;
- PECL 擴展的 PHP 實現包 polyfill ;
- 一個建立在多個版本生成器和 UUID 組件之上的抽象層 ramsey/uuid;
- 用於 PHP 7.4 以上版本的 FFI 綁定;
我創建了一組 基準測試可以對這些實現進行比較。
UUID V1 版本 (基於時間)#
+----------------------+---------+-------+
| 主題 | 平均時間 | 插值 |
+----------------------+---------+-------+
| benchPecl | 0.637μs | 1.00x |
| benchSymfonyPolyfill | 1.736μs | 2.72x |
| benchJoliCodeFFI | 1.349μs | 2.12x |
| benchRamsey | 4.295μs | 6.74x |
+----------------------+---------+-------+
UUID V4 版本 (隨機數)#
+----------------------+---------+-------+
| 主題 | 平均時間 | 插值 |
+----------------------+---------+-------+
| benchPecl | 4.546μs | 2.87x |
| benchSymfonyPolyfill | 1.583μs | 1.00x |
| benchJoliCodeFFI | 5.416μs | 3.42x |
| benchRamsey | 2.103μs | 1.33x |
+----------------------+---------+-------+
這些版本有什麼不同?
V1
V1 是基於時間的。它沒有太多隨機數據,但是每個 UUID 必須是唯一的,因此需要一個內部計數器。
- PECL 是這裏最快的,因爲它使用內核的一些特性來獲得增量數據。
- FFI 綁定比較慢,因爲在底層庫中,FFI 對於速度非常快的東西會有很大的開銷。這種開銷來自於 PHP 和底層庫之間的轉換類型。
- Polyfill 的速度較慢,因爲它必須手動處理計數器。
- Rasmey 實現最慢,因爲它處理計數器的方式可以改進。
V4
V4 充滿了隨機數據。這意味着 CPU 生成一個 V4 比生成一個 V1 更加昂貴。
- 由於 PHP 的原因 Polyfill 是最快的。PHP 使用了
sys_getrandom()
,一種更快的方式來獲取隨機數據。 - 由於相同的原因,Rasmey 實現也非常快。
- PECL 的運行速度要慢得多,因爲底層庫 (
libuuid
) 每次從 PHP 的代碼中調用uuid_create()
時都會在/dev/urandom
上打開一個新的文件描述符。 - FFI 綁定是最慢的,因爲它依賴於相同的
libuuid
庫,並且增加了 FFI 開銷。
結論
現在您已經瞭解了有關 uuid 的所有知識,因此… 只需做出 正確的選擇
請記住,FFI 綁定僅適用於 PHP 7.4+,因此(目前)在很多項目中可能無法使用。
ramsey /uuid 是一個利用許多 UUID 生成器的 UUID 組件(它可以在內部使用 PECL )。在 ramsey /uuid 實現中使用 polyfill 可能會很有意思。
由於 polyfill 與 PECL 擴展是一樣的,所以最後的選擇是關於 API 的:
- 簡單的:PECL(如果您無法安裝擴展程序,則使用 polyfill )。
- 更加豐富的功能:ramsey /uuid 組件。
- 成熟的:FFI 綁定。
現在,您瞭解了所有使用 PHP 生成 UUID 的方法,只需要使用合適的方法即可。
八重櫻:怎麼從一名碼農成爲架構師的必看知識點:目錄大全(不定期更新)zhuanlan.zhihu.com
以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提升,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨需要的可以免費分享給大家,需要的可以加入我的官方羣點擊此處。