1. Go to this page and download the library: Download erikwang2013/snowflake-php library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
erikwang2013 / snowflake-php example snippets
use Erikwang2013\Snowflake\Snowflake;
$snowflake = new Snowflake();
$id = $snowflake->id(); // e.g. 508047278033704960
$id = $snowflake->nextId(); // alias for id()
$snowflake = new Snowflake(workerId: 5, datacenterId: 3);
$id = $snowflake->id();
Snowflake::lifespanMs(); // default layout, ~69.7 years in ms
Snowflake::lifespanMs(workerBits: 7, datacenterBits: 7, sequenceBits: 10); // ~17.4 years in ms
// Container
$id = app('snowflake')->id();
// Dependency injection
use Erikwang2013\Snowflake\Snowflake;
class IndexController
{
public function index(Snowflake $snowflake)
{
$id = $snowflake->id();
}
}
// Facade
use Erikwang2013\Snowflake\Adapters\ThinkPHP\Facade;
$id = Facade::id();
use Erikwang2013\Snowflake\Snowflake;
return [
Snowflake::class => function () {
return Snowflake::fromConfig(config('snowflake'));
},
];
use Erikwang2013\Snowflake\Snowflake;
class OrderService
{
public function __construct(private Snowflake $snowflake) {}
public function create(): int
{
return $this->snowflake->id();
}
}
use Erikwang2013\Snowflake\Adapters\Psr11\SnowflakeFactory;
use Erikwang2013\Snowflake\Snowflake;
return [
'container' => [
'singletons' => [
Snowflake::class => new SnowflakeFactory(
// Container
$id = Yii::$container->get(Snowflake::class)->id();
// Dependency injection — the container resolves the type hint
use Erikwang2013\Snowflake\Snowflake;
class OrderService
{
public function __construct(private Snowflake $snowflake) {}
public function create(): int
{
return $this->snowflake->id();
}
}
$service = Yii::$container->get(OrderService::class);
use Erikwang2013\Snowflake\Snowflake;
$id = $container->get(Snowflake::class)->id();
class OrderService
{
public function __construct(private Snowflake $snowflake) {}
public function create(): int
{
return $this->snowflake->id();
}
}
use Erikwang2013\Snowflake\Adapters\Psr11\SnowflakeFactory;
$container->set(\Erikwang2013\Snowflake\Snowflake::class, new SnowflakeFactory($config));
// or build the config from the environment:
$container->set(\Erikwang2013\Snowflake\Snowflake::class, SnowflakeFactory::fromEnvironment());
use Erikwang2013\Snowflake\Snowflake;
// Same variable names the Laravel adapter uses, so one .env-style setup
// works whether or not a framework is present.
$snowflake = Snowflake::fromConfig([
'worker_id' => (int) (getenv('SNOWFLAKE_WORKER_ID') ?: 0),
'datacenter_id' => (int) (getenv('SNOWFLAKE_DATACENTER_ID') ?: 0),
'clock_tolerance_ms' => 5,
]);
$id = $snowflake->id();
use Erikwang2013\Snowflake\Resolvers\SequentialSequenceResolver;
$snowflake = new Snowflake(
sequenceResolver: new SequentialSequenceResolver()
);
use Erikwang2013\Snowflake\Resolvers\RandomSequenceResolver;
$snowflake = new Snowflake(
sequenceResolver: new RandomSequenceResolver()
);
use Erikwang2013\Snowflake\Contracts\SequenceResolver;
class SharedCounterSequenceResolver implements SequenceResolver
{
public function next(int $timestamp, int $maxSequence): ?int
{
$key = "snowflake:seq:{$timestamp}";
$seq = redis()->incr($key);
redis()->expire($key, 1);
if ($seq > $maxSequence) {
return null;
}
return $seq - 1;
}
}
use Erikwang2013\Snowflake\Resolvers\RedisSequenceResolver;
// Any client exposing incr(string $key): int and expire(string $key, int $seconds): bool
$resolver = new RedisSequenceResolver($redis, 'snowflake:seq:', 1);
$snowflake = new Snowflake(sequenceResolver: $resolver);
// Read from environment, hostname hash, or service discovery
$workerId = (int) getenv('WORKER_ID');
$datacenterId = (int) getenv('DC_ID');
$snowflake = new Snowflake(
workerId: $workerId,
datacenterId: $datacenterId
);
// 10 worker bits = 1024 workers, 0 datacenter bits = single DC
$snowflake = new Snowflake(
workerId: $workerId,
workerBits: 10,
datacenterBits: 0
);