godruoyi / php-snowflake
基于Snowflake算法(Twitter发布)的PHP ID生成器。
3.1.0
2024-04-08 07:08 UTC
Requires
- php-64bit: >=8.1
Requires (Dev)
- ext-redis: *
- ext-swoole: *
- illuminate/contracts: ^10.0 || ^11.0
- laravel/pint: ^1.10
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10
- predis/predis: ^2.0
README
基于Snowflake算法(Twitter发布)的PHP ID生成器。
描述
Snowflake & Sonyflake算法的PHP实现 中文文档.
Snowflake是一种高并发环境下生成唯一ID的网络服务,具有简单保证。
- 第一位是一个未使用的符号位。
- 第二部分由41位时间戳(以毫秒为单位)组成,表示当前时间相对于某个参考时间的偏移量。
- 第三和第四部分由5位组成,表示数据中心ID和工作者ID。两者的最大值都是31(2^5 -1)。
- 最后一部分由12位组成,表示每个工作节点每毫秒生成的序列号长度。在同一个毫秒内可以生成最多4095个ID(2^12 -1)。
如果您想使用Snowflake算法生成唯一ID,必须确保同一节点上同一毫秒生成的序列号是唯一的。基于此要求,我们创建了此包,它集成了多个序列号提供者。
- RandomSequenceResolver(随机序列号,不安全)
- FileLockResolver(使用PHP文件锁
fopen/flock
,并发安全) - RedisSequenceResolver(Redis psetex和incrby,并发安全)
- PredisSequenceResolver(redis psetex和incrby,并发安全)
- LaravelSequenceResolver(Laravel Cache add 锁机制)
- SwooleSequenceResolver(swoole_lock for 并发安全)
要求
- PHP >= 8.1
- Composer
安装
$ composer require godruoyi/php-snowflake -vvv # Install `predis/predis` package if you are using PredisSequenceResolver $ composer require "predis/predis" # Install `Redis` extensions if you are using RedisSequenceResolver $ pecl install redis # Install `Swoole` extensions if you are using SwooleSequenceResolver $ pecl install swoole
使用
- 简单易用。
$snowflake = new \Godruoyi\Snowflake\Snowflake; $snowflake->id(); // 1537200202186752
- 指定数据中心ID和机器ID。
$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId); $snowflake->id();
- 指定起始时间。
$snowflake = new \Godruoyi\Snowflake\Snowflake; $snowflake->setStartTimeStamp(strtotime('2019-09-09')*1000); // millisecond $snowflake->id();
41位时间戳(以毫秒为单位)的最大值可以表示高达69年,因此Snowflake算法可以安全运行69年。为了充分利用这一点,我们建议设置起始时间。
- 使用Sonyflake
$sonyflake = new \Godruoyi\Snowflake\Sonyflake; $sonyflake->id();
高级
- 用于Laravel。
由于SDK非常简单直接,我们不提供针对Laravel的特定扩展。但是,您可以按照以下步骤轻松将其集成到您的Laravel项目中。
// App\Providers\AppServiceProvider use Godruoyi\Snowflake\Snowflake; use Godruoyi\Snowflake\LaravelSequenceResolver; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->singleton('snowflake', function ($app) { return (new Snowflake()) ->setStartTimeStamp(strtotime('2019-10-10')*1000) ->setSequenceResolver(new LaravelSequenceResolver($app->get('cache.store'))); }); } }
- 自定义
要自定义序列号解析器,您需要实现Godruoyi\Snowflake\SequenceResolver接口。
class YourSequence implements SequenceResolver { /** * {@inheritdoc} */ public function sequence(int $currentMillisecond) { // Just test. return mt_rand(0, 1); } } // usage $snowflake->setSequenceResolver(new YourSequence); $snowflake->id();
您还可以使用闭包
$snowflake = new \Godruoyi\Snowflake\Snowflake; $snowflake->setSequenceResolver(function ($currentMillisecond) { static $lastTime; static $sequence; if ($lastTime == $currentMillisecond) { ++$sequence; } else { $sequence = 0; } $lastTime = $currentMillisecond; return $sequence; })->id();
许可协议
MIT