{"id":15623163,"url":"https://github.com/godruoyi/php-snowflake","last_synced_at":"2025-05-14T23:05:16.369Z","repository":{"id":37285683,"uuid":"201936013","full_name":"godruoyi/php-snowflake","owner":"godruoyi","description":"❄ An ID Generator for PHP based on Snowflake Algorithm (Twitter announced).","archived":false,"fork":false,"pushed_at":"2025-04-30T13:43:06.000Z","size":145,"stargazers_count":826,"open_issues_count":0,"forks_count":96,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-30T15:03:36.727Z","etag":null,"topics":["laravel","php","snowflake-algorithm","unique-id"],"latest_commit_sha":null,"homepage":"https://godruoyi.com/posts/php-id-generator-based-on-snowflake-algorithm","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/godruoyi.png","metadata":{"files":{"readme":"README-zh_CN.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"custom":["https://images.godruoyi.com/wechat.png"]}},"created_at":"2019-08-12T13:29:17.000Z","updated_at":"2025-04-30T13:41:07.000Z","dependencies_parsed_at":"2025-04-13T19:37:25.765Z","dependency_job_id":"0d86c3d5-812a-4435-a260-92f1fe8d3658","html_url":"https://github.com/godruoyi/php-snowflake","commit_stats":{"total_commits":79,"total_committers":8,"mean_commits":9.875,"dds":"0.35443037974683544","last_synced_commit":"b8f5f847c7bf887c7c1a84a1bb94228def07fab6"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godruoyi%2Fphp-snowflake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godruoyi%2Fphp-snowflake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godruoyi%2Fphp-snowflake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/godruoyi%2Fphp-snowflake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/godruoyi","download_url":"https://codeload.github.com/godruoyi/php-snowflake/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254243358,"owners_count":22038046,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["laravel","php","snowflake-algorithm","unique-id"],"created_at":"2024-10-03T09:56:33.630Z","updated_at":"2025-05-14T23:05:11.332Z","avatar_url":"https://github.com/godruoyi.png","language":"PHP","readme":"\u003cdiv\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimage src=\"https://www.pngkey.com/png/full/105-1052235_snowflake-png-transparent-background-snowflake-with-clear-background.png\" width=\"250\" height=\"250\"\u003e\u003c/image\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003eAn ID Generator for PHP based on Snowflake Algorithm (Twitter announced).\u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/godruoyi/php-snowflake/actions/workflows/test.yml\"\u003e\n      \u003cimage src=\"https://github.com/godruoyi/php-snowflake/actions/workflows/test.yml/badge.svg\" alt=\"build passed\"\u003e\u003c/image\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://codecov.io/gh/godruoyi/php-snowflake\"\u003e\n      \u003cimg src=\"https://codecov.io/gh/godruoyi/php-snowflake/branch/master/graph/badge.svg?token=7AAOYCJK97\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/godruoyi/php-snowflake\"\u003e\n      \u003cimage src=\"https://poser.pugx.org/godruoyi/php-snowflake/license\" alt=\"License\"\u003e\u003c/image\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/godruoyi/php-snowflake\"\u003e\n      \u003cimage src=\"https://poser.pugx.org/godruoyi/php-snowflake/v/stable\" alt=\"Packagist Version\"\u003e\u003c/image\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/godruoyi/php-snowflake\"\u003e\n      \u003cimage src=\"https://poser.pugx.org/godruoyi/php-snowflake/downloads\" alt=\"Total Downloads\"\u003e\u003c/image\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n## 说明\n\n雪花算法的 PHP 实现\n\n![file](https://images.godruoyi.com/comments/201908/13/_1565668072_AbkRnhQaYk.png)\n\nSnowflake 是 Twitter 内部的一个 ID 生算法，可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码。其组成为：\n\n* 第一个 bit 为未使用的符号位。\n* 第二部分由 41 位的时间戳（毫秒）构成，他的取值是当前时间相对于某一时间的偏移量。\n* 第三部分和第四部分的 5 个 bit 位表示数据中心和机器ID，其能表示的最大值为 2^5 -1 = 31。\n* 最后部分由 12 个 bit 组成，其表示每个工作节点**每毫秒**生成的序列号 ID，同一毫秒内最多可生成 2^12 -1 即 4095 个 ID。\n\n需要注意的是：\n\n* 在分布式环境中，5 个 bit 位的 datacenter 和 worker 表示最多能部署 31 个数据中心，每个数据中心最多可部署 31 台节点。\n* 41 位的二进制长度最多能表示 2^41 -1 毫秒即 69 年，所以雪花算法最多能正常使用 69 年，为了能最大限度的使用该算法，你应该为其指定一个开始时间。\n\n\u003e 由上可知，雪花算法生成的 ID 并不能保证唯一，如当两个不同请求同一时刻进入相同的数据中心的相同节点时，而此时该节点生成的 sequence 又是相同时，就会导致生成的 ID 重复。\n\n所以要想使用雪花算法生成唯一的 ID，就需要保证同一节点同一毫秒内生成的序列号是唯一的。基于此，我们在 SDK 中集成了多种序列号提供者：\n\n* RandomSequenceResolver（随机生成）\n* RedisSequenceResolver （基于 redis psetex 和 incrby 生成）\n* PredisSequenceResolver （基于 redis psetex 和 incrby 生成）\n* LaravelSequenceResolver（基于 redis psetex 和 incrby 生成）\n* SwooleSequenceResolver（基于 swoole_lock 锁）\n* FileLockResolver（基于 PHP 文件锁）\n\n\u003e **Warning**\n\u003e RandomSequenceResolver 序列号提供者在高并发情况下可能会导致生成的 ID 重复，如果你的应用场景中可能会出现高并发的情况，建议使用 RedisSequenceResolver 或者 LaravelSequenceResolver。\n\n## 要求\n\n1. PHP \u003e= 8.1\n2. **[Composer](https://getcomposer.org/)**\n\n## 安装\n\n```shell\n$ composer require godruoyi/php-snowflake -vvv\n```\n\n## 使用\n\n1. 简单使用.\n\n```php\n$snowflake = new \\Godruoyi\\Snowflake\\Snowflake;\n\n$snowflake-\u003eid();\n// 1537200202186752\n```\n\n2. 指定数据中心ID及机器ID.\n\n```php\n$snowflake = new \\Godruoyi\\Snowflake\\Snowflake($datacenterId, $workerId);\n\n$snowflake-\u003eid();\n```\n\n3. 指定开始时间.\n\n```php\n$snowflake = new \\Godruoyi\\Snowflake\\Snowflake;\n$snowflake-\u003esetStartTimeStamp(strtotime('2019-08-08')*1000);\n\n$snowflake-\u003eid();\n```\n\n## 高级\n\n1. 在 Laravel 中使用\n\n因为 SDK 相对简单，我们并没有提供 Laravel 的扩展包，你可通过下面的方式快速集成到 Laravel 中。\n\n```php\n// App\\Providers\\AppServiceProvider\n\nuse Godruoyi\\Snowflake\\Snowflake;\nuse Godruoyi\\Snowflake\\LaravelSequenceResolver;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    /**\n     * Register any application services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this-\u003eapp-\u003esingleton('snowflake', function ($app) {\n            return (new Snowflake())\n                -\u003esetStartTimeStamp(strtotime('2019-10-10')*1000)\n                -\u003esetSequenceResolver(new LaravelSequenceResolver($app-\u003eget('cache.store')));\n        });\n    }\n}\n}\n```\n\n2. 自定义序列号解决器\n\n你可以通过实现 Godruoyi\\Snowflake\\SequenceResolver 接口来自定义序列号解决器。\n\n```php\nclass YourSequence implements SequenceResolver\n{\n    /**\n     *  {@inheritdoc}\n     */\n    public function sequence(int $currentTime)\n    {\n          // Just test.\n        return mt_rand(0, 1);\n    }\n}\n\n// usage\n\n$snowflake-\u003esetSequenceResolver(new YourSequence);\n$snowflake-\u003eid();\n```\n\n你也可以直接使用闭包：\n\n```php\n$snowflake = new \\Godruoyi\\Snowflake\\Snowflake;\n$snowflake-\u003esetSequenceResolver(function ($currentTime) {\n    static $lastTime;\n    static $sequence;\n\n    if ($lastTime == $currentTime) {\n        ++$sequence;\n    } else {\n        $sequence = 0;\n    }\n\n    $lastTime = $currentTime;\n\n    return $sequence;\n})-\u003eid();\n```\n\n## License\n\nMIT\n","funding_links":["https://images.godruoyi.com/wechat.png"],"categories":["PHP"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgodruoyi%2Fphp-snowflake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgodruoyi%2Fphp-snowflake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgodruoyi%2Fphp-snowflake/lists"}