Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8e6b1bf

Browse files
ImplementDIGEST and_digest helper (for php >= 8.1)
Redis implemented new CAS semantics which work both with values and theXXH3 digest of those values.This commit implements the Redis command itself and a helper whichcomputes the XXH3 digest locally. Note that we can only be sure to havethe `XXH3` hashing algorithm in PHP >= 8.1 so the `_digest` helper islimited to PHP 8.1 or newer.
1 parentbf2047e commit8e6b1bf

11 files changed

+211
-4
lines changed

‎redis.c‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2620,6 +2620,24 @@ PHP_METHOD(Redis, _pack) {
26202620
redis_pack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,redis_sock);
26212621
}
26222622

2623+
#ifPHP_VERSION_ID >=80100
2624+
PHP_METHOD(Redis,_digest) {
2625+
RedisSock*redis_sock;
2626+
zval*zv;
2627+
2628+
redis_sock=redis_sock_get_instance(getThis(),0);
2629+
if (redis_sock==NULL) {
2630+
RETURN_FALSE;
2631+
}
2632+
2633+
ZEND_PARSE_PARAMETERS_START(1,1)
2634+
Z_PARAM_ZVAL(zv)
2635+
ZEND_PARSE_PARAMETERS_END();
2636+
2637+
RETURN_STR(redis_digest_handler(redis_sock,zv));
2638+
}
2639+
#endif
2640+
26232641
PHP_METHOD(Redis,_unpack) {
26242642
RedisSock*redis_sock;
26252643

@@ -3180,6 +3198,10 @@ PHP_METHOD(Redis, geosearchstore) {
31803198
REDIS_PROCESS_CMD(geosearchstore,redis_long_response);
31813199
}
31823200

3201+
PHP_METHOD(Redis,digest) {
3202+
REDIS_PROCESS_KW_CMD("DIGEST",redis_key_cmd,redis_ping_response);
3203+
}
3204+
31833205
/*
31843206
* Vectors
31853207
*/

‎redis.stub.php‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,17 @@ public function _unserialize(string $value): mixed;
590590
*/
591591
publicfunction_pack(mixed$value):string;
592592

593+
#if PHP_VERSION_ID >= 80100
594+
595+
/**
596+
* Compute the XXH3 digest of a packed value.
597+
*
598+
* @param mixed $value The value to compute the digest for.
599+
* @return string The computed digest.
600+
*/
601+
publicfunction_digest(mixed$value):string;
602+
#endif
603+
593604
/**
594605
* Unpack the provided value with the configured compressor and serializer
595606
* as set with Redis::setOption().
@@ -5037,6 +5048,16 @@ public function zunion(array $keys, ?array $weights = null, ?array $options = nu
50375048
* $redis->zUnionStore('dst', ['zs1', 'zs2', 'zs3']);
50385049
*/
50395050
publicfunctionzunionstore(string$dst,array$keys, ?array$weights =null, ?string$aggregate =null):Redis|int|false;
5051+
5052+
/**
5053+
* Ask the server for the XXH3 digest of a given key's value
5054+
*
5055+
* @param strinig $key The key to retrieve the digest for.
5056+
* @return Redis|string|false The XXH3 digest as a string or false on failure.
5057+
*/
5058+
publicfunctiondigest(string$key):Redis|string|false;
50405059
}
50415060

5061+
5062+
50425063
class RedisExceptionextends RuntimeException {}

‎redis_arginfo.h‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:4c712b9de716d8008f7d3b38aa8b7125b08a042b */
2+
* Stub hash:b3bd2917baa5afac66331f28a0d2cdd6a7981083 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct,0,0,0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0,options,IS_ARRAY,1,"null")
@@ -28,6 +28,12 @@ ZEND_END_ARG_INFO()
2828

2929
#definearginfo_class_Redis__pack arginfo_class_Redis__serialize
3030

31+
#ifPHP_VERSION_ID >=80100
32+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis__digest,0,1,IS_STRING,0)
33+
ZEND_ARG_TYPE_INFO(0,value,IS_MIXED,0)
34+
ZEND_END_ARG_INFO()
35+
#endif
36+
3137
#definearginfo_class_Redis__unpack arginfo_class_Redis__unserialize
3238

3339
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_acl,0,1,IS_MIXED,0)
@@ -1299,6 +1305,8 @@ ZEND_END_ARG_INFO()
12991305

13001306
#definearginfo_class_Redis_zunionstore arginfo_class_Redis_zinterstore
13011307

1308+
#definearginfo_class_Redis_digest arginfo_class_Redis_dump
1309+
13021310
ZEND_METHOD(Redis,__construct);
13031311
ZEND_METHOD(Redis,__destruct);
13041312
ZEND_METHOD(Redis,_compress);
@@ -1307,6 +1315,9 @@ ZEND_METHOD(Redis, _prefix);
13071315
ZEND_METHOD(Redis,_serialize);
13081316
ZEND_METHOD(Redis,_unserialize);
13091317
ZEND_METHOD(Redis,_pack);
1318+
#ifPHP_VERSION_ID >=80100
1319+
ZEND_METHOD(Redis,_digest);
1320+
#endif
13101321
ZEND_METHOD(Redis,_unpack);
13111322
ZEND_METHOD(Redis,acl);
13121323
ZEND_METHOD(Redis,append);
@@ -1583,6 +1594,7 @@ ZEND_METHOD(Redis, zinterstore);
15831594
ZEND_METHOD(Redis,zscan);
15841595
ZEND_METHOD(Redis,zunion);
15851596
ZEND_METHOD(Redis,zunionstore);
1597+
ZEND_METHOD(Redis,digest);
15861598

15871599
staticconstzend_function_entryclass_Redis_methods[]= {
15881600
ZEND_ME(Redis,__construct,arginfo_class_Redis___construct,ZEND_ACC_PUBLIC)
@@ -1593,6 +1605,9 @@ static const zend_function_entry class_Redis_methods[] = {
15931605
ZEND_ME(Redis,_serialize,arginfo_class_Redis__serialize,ZEND_ACC_PUBLIC)
15941606
ZEND_ME(Redis,_unserialize,arginfo_class_Redis__unserialize,ZEND_ACC_PUBLIC)
15951607
ZEND_ME(Redis,_pack,arginfo_class_Redis__pack,ZEND_ACC_PUBLIC)
1608+
#ifPHP_VERSION_ID >=80100
1609+
ZEND_ME(Redis,_digest,arginfo_class_Redis__digest,ZEND_ACC_PUBLIC)
1610+
#endif
15961611
ZEND_ME(Redis,_unpack,arginfo_class_Redis__unpack,ZEND_ACC_PUBLIC)
15971612
ZEND_ME(Redis,acl,arginfo_class_Redis_acl,ZEND_ACC_PUBLIC)
15981613
ZEND_ME(Redis,append,arginfo_class_Redis_append,ZEND_ACC_PUBLIC)
@@ -1884,6 +1899,7 @@ static const zend_function_entry class_Redis_methods[] = {
18841899
ZEND_ME(Redis,zscan,arginfo_class_Redis_zscan,ZEND_ACC_PUBLIC)
18851900
ZEND_ME(Redis,zunion,arginfo_class_Redis_zunion,ZEND_ACC_PUBLIC)
18861901
ZEND_ME(Redis,zunionstore,arginfo_class_Redis_zunionstore,ZEND_ACC_PUBLIC)
1902+
ZEND_ME(Redis,digest,arginfo_class_Redis_digest,ZEND_ACC_PUBLIC)
18871903
ZEND_FE_END
18881904
};
18891905

‎redis_cluster.c‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2024,6 +2024,19 @@ PHP_METHOD(RedisCluster, _pack) {
20242024
redis_pack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,c->flags);
20252025
}
20262026

2027+
#ifPHP_VERSION_ID >=80100
2028+
PHP_METHOD(RedisCluster,_digest) {
2029+
redisCluster*c=GET_CONTEXT();
2030+
zval*zv;
2031+
2032+
ZEND_PARSE_PARAMETERS_START(1,1)
2033+
Z_PARAM_ZVAL(zv)
2034+
ZEND_PARSE_PARAMETERS_END();
2035+
2036+
RETURN_STR(redis_digest_handler(c->flags,zv));
2037+
}
2038+
#endif
2039+
20272040
PHP_METHOD(RedisCluster,_unpack) {
20282041
redisCluster*c=GET_CONTEXT();
20292042
redis_unpack_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU,c->flags);
@@ -3438,5 +3451,9 @@ PHP_METHOD(RedisCluster, copy) {
34383451
CLUSTER_PROCESS_CMD(copy,cluster_1_resp,0);
34393452
}
34403453

3454+
PHP_METHOD(RedisCluster,digest) {
3455+
CLUSTER_PROCESS_KW_CMD("DIGEST",redis_key_cmd,cluster_bulk_raw_resp,1);
3456+
}
3457+
34413458
/* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4: */
34423459

‎redis_cluster.stub.php‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ public function _unserialize(string $value): mixed;
7474
*/
7575
publicfunction_pack(mixed$value):string;
7676

77+
#if PHP_VERSION_ID >= 80100
78+
/**
79+
* @see Redis::_digest()
80+
*/
81+
publicfunction_digest(string$value):string;
82+
#endif
83+
7784
/**
7885
* @see Redis::_unpack()
7986
*/
@@ -1380,6 +1387,11 @@ public function zunion(array $keys, ?array $weights = null, ?array $options = nu
13801387
* @see https://redis.io/commands/zdiff
13811388
*/
13821389
publicfunctionzdiff(array$keys, ?array$options =null):RedisCluster|array|false;
1390+
1391+
/**
1392+
* @see https://redis.io/commands/digest
1393+
*/
1394+
publicfunctiondigest(string$key):RedisCluster|string|false;
13831395
}
13841396

13851397
class RedisClusterExceptionextends RuntimeException {}

‎redis_cluster_arginfo.h‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:cd1fe38b8b2078964d1b7f50252f6f931d20fd35 */
2+
* Stub hash:390bc7324c3678a103fdff12ee552fd9e74975f8 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct,0,0,1)
55
ZEND_ARG_TYPE_INFO(0,name,IS_STRING,1)
@@ -29,6 +29,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisCluster__pack, 0, 1,
2929
ZEND_ARG_TYPE_INFO(0,value,IS_MIXED,0)
3030
ZEND_END_ARG_INFO()
3131

32+
#ifPHP_VERSION_ID >=80100
33+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisCluster__digest,0,1,IS_STRING,0)
34+
ZEND_ARG_TYPE_INFO(0,value,IS_STRING,0)
35+
ZEND_END_ARG_INFO()
36+
#endif
37+
3238
#definearginfo_class_RedisCluster__unpack arginfo_class_RedisCluster__unserialize
3339

3440
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisCluster__prefix,0,1,MAY_BE_BOOL|MAY_BE_STRING)
@@ -1187,12 +1193,17 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_zdiff, 0,
11871193
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0,options,IS_ARRAY,1,"null")
11881194
ZEND_END_ARG_INFO()
11891195

1196+
#definearginfo_class_RedisCluster_digest arginfo_class_RedisCluster_dump
1197+
11901198
ZEND_METHOD(RedisCluster,__construct);
11911199
ZEND_METHOD(RedisCluster,_compress);
11921200
ZEND_METHOD(RedisCluster,_uncompress);
11931201
ZEND_METHOD(RedisCluster,_serialize);
11941202
ZEND_METHOD(RedisCluster,_unserialize);
11951203
ZEND_METHOD(RedisCluster,_pack);
1204+
#ifPHP_VERSION_ID >=80100
1205+
ZEND_METHOD(RedisCluster,_digest);
1206+
#endif
11961207
ZEND_METHOD(RedisCluster,_unpack);
11971208
ZEND_METHOD(RedisCluster,_prefix);
11981209
ZEND_METHOD(RedisCluster,_masters);
@@ -1443,6 +1454,7 @@ ZEND_METHOD(RedisCluster, zinter);
14431454
ZEND_METHOD(RedisCluster,zdiffstore);
14441455
ZEND_METHOD(RedisCluster,zunion);
14451456
ZEND_METHOD(RedisCluster,zdiff);
1457+
ZEND_METHOD(RedisCluster,digest);
14461458

14471459
staticconstzend_function_entryclass_RedisCluster_methods[]= {
14481460
ZEND_ME(RedisCluster,__construct,arginfo_class_RedisCluster___construct,ZEND_ACC_PUBLIC)
@@ -1451,6 +1463,9 @@ static const zend_function_entry class_RedisCluster_methods[] = {
14511463
ZEND_ME(RedisCluster,_serialize,arginfo_class_RedisCluster__serialize,ZEND_ACC_PUBLIC)
14521464
ZEND_ME(RedisCluster,_unserialize,arginfo_class_RedisCluster__unserialize,ZEND_ACC_PUBLIC)
14531465
ZEND_ME(RedisCluster,_pack,arginfo_class_RedisCluster__pack,ZEND_ACC_PUBLIC)
1466+
#ifPHP_VERSION_ID >=80100
1467+
ZEND_ME(RedisCluster,_digest,arginfo_class_RedisCluster__digest,ZEND_ACC_PUBLIC)
1468+
#endif
14541469
ZEND_ME(RedisCluster,_unpack,arginfo_class_RedisCluster__unpack,ZEND_ACC_PUBLIC)
14551470
ZEND_ME(RedisCluster,_prefix,arginfo_class_RedisCluster__prefix,ZEND_ACC_PUBLIC)
14561471
ZEND_ME(RedisCluster,_masters,arginfo_class_RedisCluster__masters,ZEND_ACC_PUBLIC)
@@ -1701,6 +1716,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
17011716
ZEND_ME(RedisCluster,zdiffstore,arginfo_class_RedisCluster_zdiffstore,ZEND_ACC_PUBLIC)
17021717
ZEND_ME(RedisCluster,zunion,arginfo_class_RedisCluster_zunion,ZEND_ACC_PUBLIC)
17031718
ZEND_ME(RedisCluster,zdiff,arginfo_class_RedisCluster_zdiff,ZEND_ACC_PUBLIC)
1719+
ZEND_ME(RedisCluster,digest,arginfo_class_RedisCluster_digest,ZEND_ACC_PUBLIC)
17041720
ZEND_FE_END
17051721
};
17061722

‎redis_cluster_legacy_arginfo.h‎

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash:cd1fe38b8b2078964d1b7f50252f6f931d20fd35 */
2+
* Stub hash:390bc7324c3678a103fdff12ee552fd9e74975f8 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct,0,0,1)
55
ZEND_ARG_INFO(0,name)
@@ -23,6 +23,12 @@ ZEND_END_ARG_INFO()
2323

2424
#definearginfo_class_RedisCluster__pack arginfo_class_RedisCluster__compress
2525

26+
#ifPHP_VERSION_ID >=80100
27+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster__digest,0,0,1)
28+
ZEND_ARG_INFO(0,value)
29+
ZEND_END_ARG_INFO()
30+
#endif
31+
2632
#definearginfo_class_RedisCluster__unpack arginfo_class_RedisCluster__compress
2733

2834
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster__prefix,0,0,1)
@@ -1016,12 +1022,17 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_zdiff, 0, 0, 1)
10161022
ZEND_ARG_INFO(0,options)
10171023
ZEND_END_ARG_INFO()
10181024

1025+
#definearginfo_class_RedisCluster_digest arginfo_class_RedisCluster__prefix
1026+
10191027
ZEND_METHOD(RedisCluster,__construct);
10201028
ZEND_METHOD(RedisCluster,_compress);
10211029
ZEND_METHOD(RedisCluster,_uncompress);
10221030
ZEND_METHOD(RedisCluster,_serialize);
10231031
ZEND_METHOD(RedisCluster,_unserialize);
10241032
ZEND_METHOD(RedisCluster,_pack);
1033+
#ifPHP_VERSION_ID >=80100
1034+
ZEND_METHOD(RedisCluster,_digest);
1035+
#endif
10251036
ZEND_METHOD(RedisCluster,_unpack);
10261037
ZEND_METHOD(RedisCluster,_prefix);
10271038
ZEND_METHOD(RedisCluster,_masters);
@@ -1272,6 +1283,7 @@ ZEND_METHOD(RedisCluster, zinter);
12721283
ZEND_METHOD(RedisCluster,zdiffstore);
12731284
ZEND_METHOD(RedisCluster,zunion);
12741285
ZEND_METHOD(RedisCluster,zdiff);
1286+
ZEND_METHOD(RedisCluster,digest);
12751287

12761288
staticconstzend_function_entryclass_RedisCluster_methods[]= {
12771289
ZEND_ME(RedisCluster,__construct,arginfo_class_RedisCluster___construct,ZEND_ACC_PUBLIC)
@@ -1280,6 +1292,9 @@ static const zend_function_entry class_RedisCluster_methods[] = {
12801292
ZEND_ME(RedisCluster,_serialize,arginfo_class_RedisCluster__serialize,ZEND_ACC_PUBLIC)
12811293
ZEND_ME(RedisCluster,_unserialize,arginfo_class_RedisCluster__unserialize,ZEND_ACC_PUBLIC)
12821294
ZEND_ME(RedisCluster,_pack,arginfo_class_RedisCluster__pack,ZEND_ACC_PUBLIC)
1295+
#ifPHP_VERSION_ID >=80100
1296+
ZEND_ME(RedisCluster,_digest,arginfo_class_RedisCluster__digest,ZEND_ACC_PUBLIC)
1297+
#endif
12831298
ZEND_ME(RedisCluster,_unpack,arginfo_class_RedisCluster__unpack,ZEND_ACC_PUBLIC)
12841299
ZEND_ME(RedisCluster,_prefix,arginfo_class_RedisCluster__prefix,ZEND_ACC_PUBLIC)
12851300
ZEND_ME(RedisCluster,_masters,arginfo_class_RedisCluster__masters,ZEND_ACC_PUBLIC)
@@ -1530,6 +1545,7 @@ static const zend_function_entry class_RedisCluster_methods[] = {
15301545
ZEND_ME(RedisCluster,zdiffstore,arginfo_class_RedisCluster_zdiffstore,ZEND_ACC_PUBLIC)
15311546
ZEND_ME(RedisCluster,zunion,arginfo_class_RedisCluster_zunion,ZEND_ACC_PUBLIC)
15321547
ZEND_ME(RedisCluster,zdiff,arginfo_class_RedisCluster_zdiff,ZEND_ACC_PUBLIC)
1548+
ZEND_ME(RedisCluster,digest,arginfo_class_RedisCluster_digest,ZEND_ACC_PUBLIC)
15331549
ZEND_FE_END
15341550
};
15351551

‎redis_commands.c‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
+----------------------------------------------------------------------+
1717
*/
1818

19+
#include"hash/php_hash.h"
1920
#ifdefHAVE_CONFIG_H
2021
#include"config.h"
2122
#endif
@@ -7489,6 +7490,45 @@ void redis_pack_handler(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock) {
74897490
if (valfree)efree(val);
74907491
}
74917492

7493+
#ifPHP_VERSION_ID >=80100
7494+
zend_string*redis_digest_handler(RedisSock*redis_sock,zval*zv) {
7495+
zend_string*algo,*hex;
7496+
constphp_hash_ops*ops;
7497+
unsignedchar*digest;
7498+
intvalfree;
7499+
size_tlen;
7500+
char*val;
7501+
void*ctx;
7502+
7503+
algo=zend_string_init(ZEND_STRL("XXH3"),0);
7504+
ops=php_hash_fetch_ops(algo);
7505+
if (ops==NULL) {
7506+
zend_string_release(algo);
7507+
returnNULL;
7508+
}
7509+
7510+
valfree=redis_pack(redis_sock,zv,&val,&len);
7511+
7512+
ctx=emalloc(ops->context_size);
7513+
ops->hash_init(ctx,NULL);
7514+
ops->hash_update(ctx, (constunsignedchar*)val,len);
7515+
7516+
digest=emalloc(ops->digest_size);
7517+
ops->hash_final(digest,ctx);
7518+
7519+
hex=zend_string_safe_alloc(ops->digest_size,2,0,0);
7520+
php_hash_bin2hex(ZSTR_VAL(hex),digest,ops->digest_size);
7521+
ZSTR_VAL(hex)[ZSTR_LEN(hex)]='\0';
7522+
7523+
efree(ctx);
7524+
efree(digest);
7525+
if (valfree)efree(val);
7526+
zend_string_release(algo);
7527+
7528+
returnhex;
7529+
}
7530+
#endif
7531+
74927532
voidredis_unpack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock) {
74937533
zend_string*str;
74947534

‎redis_commands.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@ void redis_uncompress_handler(INTERNAL_FUNCTION_PARAMETERS,
456456
voidredis_pack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock);
457457
voidredis_unpack_handler(INTERNAL_FUNCTION_PARAMETERS,RedisSock*redis_sock);
458458

459+
#ifPHP_VERSION_ID >=80100
460+
zend_string*redis_digest_handler(RedisSock*redis_sock,zval*zv);
461+
#endif
462+
459463
#endif
460464

461465
/* vim: set tabstop=4 softtabstop=4 expandtab shiftwidth=4: */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp