artnum / snowflake53
生成独特的53位雪花ID
v1.0.2
2024-04-26 13:00 UTC
Requires
- php: >=8.2
Requires (Dev)
- phpunit/phpunit: ^11.1
README
一个生成53位雪花ID的特质,以适应js Number.MAX_SAFE_INTEGER。序列计数使用共享内存完成,机器ID来自环境变量或参数。也可以生成64位雪花ID。
它不需要任何外部基础设施(如Memcached或Redis等)来保持序列计数,因为它通过共享内存完成,并使用信号量进行锁定。所以其他进程也可以访问序列计数:)
安装
通过composer
$ composer require artnum/snowflake53
用法
require_once 'vendor/autoload.php'; use Snowflake53\ID; class IDGen { use ID; } $gen = new IDGen(); echo $gen->get53() . PHP_EOL; echo $gen->get64() . PHP_EOL;
所有函数都声明为静态的,所以可以不通过类实例来使用。
require_once 'vendor/autoload.php'; use Snowflake53\ID; class IDGen { use ID; } echo IDGen::get53() . PHP_EOL; echo IDGen::get64() . PHP_EOL;
如果您选择,可以通过调用destroySHM
来销毁共享内存段和信号量。
require_once 'vendor/autoload.php'; use Snowflake53\ID; class IDGen { use ID; } IDGen::destroySHM();
共享内存路径
共享内存使用文件路径作为标识。默认情况下是__FILE__
。但如果您在服务器的多个不同位置使用它,但仍希望所有ID都按顺序排列,可以将公共静态变量$SHMPath设置为所需的路径。该文件必须存在。
require_once 'src/Snowflake53.php'; use Snowflake53\ID; class IDGen { use ID; } IDGen::$SHMPath = '/tmp/snowflake53'; echo IDGen::get53() . PHP_EOL; echo IDGen::get64() . PHP_EOL; $gen = new IDGen(); $gen::$SHMPath = '/tmp/snowflake53'; echo $gen->get53() . PHP_EOL; echo $gen->get64() . PHP_EOL;
机器ID
机器ID可以作为get53
或get64
的参数传递。如果不传递,它将尝试从环境变量SNOWFLAK53_MACHINE_ID
、SNOWFLAKE64_MACHINE_ID
或SNOWFLAKE_MACHINE_ID
中获取ID。获取53位ID时,将首先查看SNOWFLAK53_MACHINE_ID
,然后是SNOWFLAKE_MACHINE_ID
;获取64位ID时,情况相反(首先查看SNOWFLAKE64_MACHINE_ID
,然后是SNOWFLAKE_MACHINE_ID
)。
背后的想法是,您为64位和53位设置唯一的机器,因此您使用SNOWFLAKE_MACHINE_ID
,或者您为53位或64位设置不同的机器ID,因此您设置SNOWFLAKE53_MACHINE_ID
和SNOWFLAKE64_MACHINE_ID
。
许可证
在MIT许可证下。
开发者
- Etienne Bagnoud etienne@artnum.ch