Downloads
Stars
Version
Snowflake & Sonyflake algorithm PHP implementation 中文文档.
Snowflake is a network service that generates unique ID numbers at high scale with simple guarantees.
If you want to generate unique IDs using the snowflake algorithm, you must ensure that sequence numbers generated within the same millisecond on the same node are unique. Based on this requirement, we have created this package which integrates multiple sequence number providers.
fopen/flock
, Concurrency Safety)$ 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
$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);
$snowflake->id();
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->setStartTimeStamp(strtotime('2019-09-09')*1000); // millisecond
$snowflake->id();
The maximum value of a 41-bit timestamp (in milliseconds) can represent up to 69 years, so the Snowflake algorithm can run safely for 69 years. In order to make the most of it, we recommend setting a start time.
$sonyflake = new \Godruoyi\Snowflake\Sonyflake;
$sonyflake->id();
Since the SDK is quite straightforward, we do not offer a specific extension for Laravel. However, you can easily integrate it into your Laravel project by following these steps.
// 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')));
});
}
}
To customize the sequence number resolver, you need to implement the Godruoyi\Snowflake\SequenceResolver interface.
class YourSequence implements SequenceResolver
{
/**
* {@inheritdoc}
*/
public function sequence(int $currentMillisecond)
{
// Just test.
return mt_rand(0, 1);
}
}
// usage
$snowflake->setSequenceResolver(new YourSequence);
$snowflake->id();
And you also can use the Closure:
$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