From 5bc17a02b724941ee1f300e527b00ecd07197f28 Mon Sep 17 00:00:00 2001 From: Albert Date: Wed, 7 Apr 2021 10:28:57 +0800 Subject: [PATCH] add README.md --- PHP/README.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ PHP/php_snowdrift.h | 2 ++ PHP/snowdrift.c | 12 +++++++++++- 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 PHP/README.md diff --git a/PHP/README.md b/PHP/README.md new file mode 100644 index 0000000..3e21322 --- /dev/null +++ b/PHP/README.md @@ -0,0 +1,50 @@ +# ❄ idenerator-php-extension + +## 介绍 +项目更多介绍参照:https://github.com/yitter/idgenerator + +## PHP环境 + +* PHP7 or later + +## 安装方式 + +```shell +git clone https://gitee.com/yitter/idgenerator.git +cd idgenerator/PHP +phpize +./configure --with-php-config=/path/php-config +make +make install +``` + +## 如何使用(PHP) + +**配置文件配置参数**: +```shell +//snowdrift.ini +snowdrift.Method=1 //1 漂移算法 2 传统算法 +snowdrift.BaseTime=1582136402000 +snowdrift.WorkerId=1 //默认workerid +snowdrift.WorkerIdNum=1 //支持的WorkerId数量,默认1,不超过(-1L << snowdrift.WorkerIdBitLength) ^ -1L +snowdrift.WorkerIdBitLength=6 +snowdrift.SeqBitLength=6 //自增序号位数 +snowdrift.MaxSeqNumber=0 +snowdrift.MinSeqNumber=0 +snowdrift.TopOverCostCount=2000 //最大漂移次数 +``` + +**函数签名**: +```php +\SnowDrift::NextId(int $wid=snowdrift.WorkerId):?int //获取单个id,$wid可选,默认值=snowdrift.WorkerId +\SnowDrift::NextNumId(int $num, int $wid=snowdrift.WorkerId):?array //获取$num个id,$wid可选,默认值=snowdrift.WorkerId +``` + +**调用示例** +```php +$id=\SnowDrift::NextId(); +$id=\SnowDrift::NextId(3); + +$ids=\SnowDrift::NextNumId(10000); +$ids=\SnowDrift::NextNumId(10000,3); +``` diff --git a/PHP/php_snowdrift.h b/PHP/php_snowdrift.h index 1027451..22b5d06 100644 --- a/PHP/php_snowdrift.h +++ b/PHP/php_snowdrift.h @@ -57,6 +57,8 @@ uint8_t WorkerId; uint8_t WorkerIdNum; uint8_t WorkerIdBitLength; uint8_t SeqBitLength; +uint32_t MaxSeqNumber; +uint32_t MinSeqNumber; uint16_t TopOverCostCount; ZEND_END_MODULE_GLOBALS(snowdrift) diff --git a/PHP/snowdrift.c b/PHP/snowdrift.c index 82a8a93..c92f5c9 100644 --- a/PHP/snowdrift.c +++ b/PHP/snowdrift.c @@ -41,11 +41,13 @@ uint8_t num = 0; PHP_INI_BEGIN() STD_PHP_INI_ENTRY("snowdrift.Method", "1", PHP_INI_SYSTEM, OnUpdateLongGEZero, Method, zend_snowdrift_globals, snowdrift_globals) -STD_PHP_INI_ENTRY("snowdrift.BaseTime", "1577808000000", PHP_INI_SYSTEM, OnUpdateLongGEZero, BaseTime, zend_snowdrift_globals, snowdrift_globals) +STD_PHP_INI_ENTRY("snowdrift.BaseTime", "1582136402000", PHP_INI_SYSTEM, OnUpdateLongGEZero, BaseTime, zend_snowdrift_globals, snowdrift_globals) STD_PHP_INI_ENTRY("snowdrift.WorkerId", "1", PHP_INI_SYSTEM, OnUpdateLongGEZero, WorkerId, zend_snowdrift_globals, snowdrift_globals) STD_PHP_INI_ENTRY("snowdrift.WorkerIdNum", "1", PHP_INI_SYSTEM, OnUpdateLongGEZero, WorkerIdNum, zend_snowdrift_globals, snowdrift_globals) STD_PHP_INI_ENTRY("snowdrift.WorkerIdBitLength", "6", PHP_INI_SYSTEM, OnUpdateLongGEZero, WorkerIdBitLength, zend_snowdrift_globals, snowdrift_globals) STD_PHP_INI_ENTRY("snowdrift.SeqBitLength", "6", PHP_INI_SYSTEM, OnUpdateLongGEZero, SeqBitLength, zend_snowdrift_globals, snowdrift_globals) +STD_PHP_INI_ENTRY("snowdrift.MaxSeqNumber", "0", PHP_INI_SYSTEM, OnUpdateLongGEZero, MaxSeqNumber, zend_snowdrift_globals, snowdrift_globals) +STD_PHP_INI_ENTRY("snowdrift.MinSeqNumber", "0", PHP_INI_SYSTEM, OnUpdateLongGEZero, MinSeqNumber, zend_snowdrift_globals, snowdrift_globals) STD_PHP_INI_ENTRY("snowdrift.TopOverCostCount", "2000", PHP_INI_SYSTEM, OnUpdateLongGEZero, TopOverCostCount, zend_snowdrift_globals, snowdrift_globals) PHP_INI_END() @@ -62,6 +64,12 @@ static int snowdrift_init() if (shm_alloc(&shmctx) == -1) { zend_throw_exception_ex(NULL, 0, "shared memory malloc failed"); + RETURN_FALSE; + } + if (SD_G(MaxSeqNumber) <= SD_G(MinSeqNumber)) + { + zend_throw_exception_ex(NULL, 0, "MaxSeqNumber must GE then MinSeqNumber"); + RETURN_FALSE; } bzero(shmctx.addr, num * sizeof(snowflake)); sf = (snowflake *)shmctx.addr; @@ -73,6 +81,8 @@ static int snowdrift_init() tmp->WorkerId = i + 1; tmp->WorkerIdBitLength = SD_G(WorkerIdBitLength); tmp->SeqBitLength = SD_G(SeqBitLength); + tmp->MaxSeqNumber = SD_G(MaxSeqNumber); + tmp->MinSeqNumber = SD_G(MinSeqNumber); tmp->TopOverCostCount = SD_G(TopOverCostCount); Config(tmp); }