godruoyi/php-snowflake

基于Snowflake算法(Twitter发布)的PHP ID生成器。

3.1.0 2024-04-08 07:08 UTC

This package is auto-updated.

Last update: 2024-09-09 08:25:20 UTC


README

基于Snowflake算法(Twitter发布)的PHP ID生成器。

build passed License Packagist Version Total Downloads

描述

Snowflake & Sonyflake算法的PHP实现 中文文档.

file

Snowflake是一种高并发环境下生成唯一ID的网络服务,具有简单保证。

  1. 第一位是一个未使用的符号位。
  2. 第二部分由41位时间戳(以毫秒为单位)组成,表示当前时间相对于某个参考时间的偏移量。
  3. 第三和第四部分由5位组成,表示数据中心ID和工作者ID。两者的最大值都是31(2^5 -1)。
  4. 最后一部分由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 并发安全

要求

  1. PHP >= 8.1
  2. 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

使用

  1. 简单易用。
$snowflake = new \Godruoyi\Snowflake\Snowflake;

$snowflake->id();
// 1537200202186752
  1. 指定数据中心ID和机器ID。
$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);

$snowflake->id();
  1. 指定起始时间。
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->setStartTimeStamp(strtotime('2019-09-09')*1000); // millisecond

$snowflake->id();

41位时间戳(以毫秒为单位)的最大值可以表示高达69年,因此Snowflake算法可以安全运行69年。为了充分利用这一点,我们建议设置起始时间。

  1. 使用Sonyflake
$sonyflake = new \Godruoyi\Snowflake\Sonyflake;

$sonyflake->id();

高级

  1. 用于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')));
        });
    }
}
  1. 自定义

要自定义序列号解析器,您需要实现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