Snowflake分佈式ID生成算法PHP的版本

php_snowflake

項目地址php

什麼是 php_snowflake?

推特分佈式id生成算法SnowFlake PHP 的實現git

需求

  • PHP >= 5.6 (5.5如下的自行測試)github

  • 不支持windows算法

說明

純PHP沒法實現SnowFlake算法,由於線程安全版本(須要tid)和非線程安全版本(須要pid)不能生成相同格式的id(本項目的tid是系統中惟一的因此不用擔憂多個進程中tid衝突),而且PHP做爲腳本語言沒法維護sequence,當腳本結束的時候sequence又要被初始化,因此在大併發狀況純PHP實現的版本SnowFlake算法根本沒有什麼做用。因此就誕生了這個項目,如下爲線程安全版本和非線程安全版本差異。windows

非線程安全版本(NTS)

0 2          15        20   28      32
---+----------------+--------------+----+----------+
00 |timestamp(ms)  | service_no   |pid | sequence |
---+----------------+--------------+----+----------+

線程安全版本(TS)

0 2          15        20   28      32
---+----------------+--------------+----+----------+
00 |timestamp(ms)  | service_no   |tid | sequence |
---+----------------+--------------+----+----------+

安裝

phpize
./configure --with-php-config=/you/phppath/php-config
make
make install

示例

注意:$service_no區間在 0-99999 超出範圍PHP將會報告一個致命錯誤!安全

$service_no = 999;
for ($i=0; $i < 10; $i++) { 
        echo PhpSnowFlake::nextId($service_no)."\n";
}
/*

00146523488416500999000634280001
00146523488416500999000634280002
00146523488416500999000634280003
00146523488416500999000634280004
00146523488416500999000634280005
00146523488416600999000634280001
00146523488416600999000634280002
00146523488416600999000634280003
00146523488416600999000634280004
00146523488416600999000634280005

*/

協議

版權 (c) 2016 歸屬於 Towers 請遵照MIT協議.併發

相關文章
相關標籤/搜索