diff --git a/CHANGELOG.md b/CHANGELOG.md index c07b485e06..cce162cabc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,41 @@ All changes to phpredis will be documented in this file. We're basing this format on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and PhpRedis adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +# [6.3.0] - 2025-11-06 ([Github](https://github.com/phpredis/phpredis/releases/6.3.0), [PECL](https://pecl.php.net/package/redis/6.3.0)) + +This release introduces support for dozens of new commands, including hash field expiration, Valkey’s DELIFEQ, and Redis vector set operations. It also delivers numerous bug fixes and performance improvements. + +### Sponsors :sparkling_heart: + +- [A-VISION](https://github.com/A-VISION-BV) +- [Avtandil Kikabidze](https://github.com/akalongman) +- [Geoffrey Hoffman](https://github.com/phpguru) +- [Object Cache Pro for WordPress](https://objectcache.pro/) +- [Open LMS](https://openlms.net/) +- [Relay](https://relay.so) +- [Salvatore Sanfilippo](https://github.com/antirez) +- [Ty Karok](https://github.com/karock) + +## Fixed + +- Cloning our objects should not segfault + [770034cc](https://github.com/phpredis/phpredis/commit/770034cc) + ([michael-grunder](https://github.com/michael-grunder)) +- Fix return type for `RedisCluster` `vgetattr` and `vsetattr` + [834d2b37](https://github.com/phpredis/phpredis/commit/ab593f01) + ([michael-grunder](https://github.com/michael-grunder)) + +### Sponsors :sparkling_heart: + +- [A-VISION](https://github.com/A-VISION-BV) +- [Avtandil Kikabidze](https://github.com/akalongman) +- [Geoffrey Hoffman](https://github.com/phpguru) +- [Object Cache Pro for WordPress](https://objectcache.pro/) +- [Open LMS](https://openlms.net/) +- [Relay](https://relay.so) +- [Salvatore Sanfilippo](https://github.com/antirez) +- [Ty Karok](https://github.com/karock) + # [6.3.0RC1] - 2025-10-15 This release introduces support for dozens of new commands, including hash field expiration, Valkey’s DELIFEQ, and Redis vector set operations. It also delivers numerous bug fixes and performance improvements. diff --git a/package.xml b/package.xml index af4b93f3ae..c44cddeeef 100644 --- a/package.xml +++ b/package.xml @@ -22,17 +22,17 @@ http://pear.php.net/dtd/package-2.0.xsd"> p.yatsukhnenko@gmail.com yes - 2025-10-15 + 2025-11-06 - 6.3.0RC1 + 6.3.0 6.2.0 - beta + stable stable PHP - + --- 6.3.0 --- --- Sponsors --- @@ -45,102 +45,12 @@ http://pear.php.net/dtd/package-2.0.xsd"> Salvatore Sanfilippo - https://github.com/antirez Ty Karok - https://github.com/karock - --- 6.3.0RC1 --- - - This release introduces support for dozens of new commands, including hash - field expiration, Valkey’s DELIFEQ, and Redis vector set operations. It also - delivers numerous bug fixes and performance improvements. - Fixed: - Fix possible hash field name truncation [834d2b37] (Michael Grunder) - Fix a possible segfault during failover [5ebb853e] (rlerdorf) - Bump version and fix XGROUP test [f5db01b7, 4517d5f9] remicollet - Fix an overflow bug in ZADD on Windows [35df8ad7] (Michael Grunder) - Fix errors and a warning [b8de91c9] (Michael Grunder) - Fix `RedisCluster` segfault [f61e8cd7] (Michael Grunder) - Fix passing NULL for hash expiry argument [ca80ee0e] (Michael Grunder) - Fix an off-by-one length calculation error [340f23b0] (Michael Grunder) - Fix hset fields handling [6b2f088d] (Pavlo Yatsukhnenko) - Fix HSetEx expiry argument handling [7805da75] (Pavlo Yatsukhnenko) - Fix the echo liveness check when in sentinel mode [2acab399] (Michael Grunder) - Fix double -> int truncation warning [152fdda9] (Michael Grunder) - Fix `SIGABRT` in PHP 8.4 with RedisArray [3c64b33f] (Novynn) - Fixing segfault in cluster_update_slot [b0ba827b] (Jacob Brown Austin) - Fix typo [d0b0c5cf] (Michael Grunder) - Fix compiling with PHP 8.5.0 alpha3 and newer [1e6f5477] (wyattoday) - Fix error length calculation + UB sanity check [e73130fe] (Michael Grunder) - Fix arguments order for `SET` command [f73f5fcc] (Pavlo Yatsukhnenko) - - Added: - - Add `hgetwithmeta` method [7d3b2e4d] (Pavlo Yatsukhnenko) - Add `maxRetries` to `redis_sock_configure` [e9e9e495] (Michael Grunder) - Implement vectorset commands [92dd256f, d80b7258, 7f9b1f41, 92716ed0, - dc91631b, 1deca628, 96378b70, 0fda9f29, 0ed0fc05, d1d69005, 286fa630, - 38115dec, c4b2ea6c, 6ce3bd53] (Michael Grunder) - Implement `GEOSEARCH[STORE]` `BYPOLYGON` [8d369f4d, f24814a4] (Michael Grunder) - Implement Valkey's `DELIFEQ` command [b1b0c191] (Michael Grunder) - Add an INI setting returning 5.x legacy behavior -- readonly session on lock - failure [8dada174] (arokettu) - Implement several hash expiration commands [7350768c] (Michael Grunder) - Introduce `Redis::serverName` and `Redis::serverVersion` methods [056c2dbe, - cbaf095f, fa3eb006] (Pavlo Yatsukhnenko, Michael Grunder) - New option 'database' for Redis class constructor [4f6a3ed1] (JakubOnderka) - Implement `HGETEX`, `HSETEX`, `HGETDEL`, and refactor `HMGET` [ce5b0fac] - (Michael Grunder) - Implement `GETDEL` for `RedisCluster` [d342e4ac] (Michael Grunder) - - ## Changed - - Check for `dragonfly_version` in `HELLO` response [593ba012] (Michael Grunder) - Simplify redis_unpack method calling [0a85bd82] (JakubOnderka) - Refactor `getWithMeta` logic [0445e683] (Michael Grunder) - cleanup session temp file [3828c929] (remicollet) - Make execHello protected [300c5fb2] (Michael Grunder) - - Documentation: - - Update Relay sponsorship [7a69d73] (Till Kruss) - Fix markdown headlines [1d662f56] (Till Kruss) - document PECL configure options [2066cfad] (Till Kruss) - Improve wording in README about project support [0ac01476] (Till Kruss) - Improve install instructions [c0076036] (Remi Collet) - Clean up README.md: fix typos, spelling, and grammar errors [09cd4c54] (Copilot) - Refine parameter descriptions and examples in README [f9f609e1] (joshtrichards) - Link to the correct header [d18db84c] (wyattoday) - Update README.md about supported PHP versions. [b7a97e5e] (AkameOuO) - Broaden return type for Redis::hGetAll [bfbab892] (mgiuffrida) - - Tests/CI: - - Add a regression test for `EVAL[SHA]` [22a2914b] (Michael Grunder) - Rework `HEXPIRE` test inclusion + bump Valkey [b83981aa] (Michael Grunder) - Add PHP 8.5 to CI [334937cb] (Pavlo Yatsukhnenko) - Attempt to fix flaky GitHub CI tests [80140003] (Michael Grunder) - Reorganize tests [807f806f] (Pavlo Yatsukhnenko) - - Internal/Performance: + * Cloning our objects should not segfault [770034cc] (michael-grunder) + * Fix return type for `RedisCluster` `vgetattr` and `vsetattr` + [834d2b37] (michael-grunder) - Introduce `[[nodiscard]]` type attribute where supported. [2d963e79] (Michael Grunder) - Fix typo (s/sees/seeds/) [25e6d5fc] (xabbuh) - Fix an unused variable warning [b48aa0d4] (Michael Grunder) - Fix several issues surfaced by `gcc -fanalyze` [8be2306e] (Michael Grunder) - Fix dead assignment [d564e8cf] (Michael Grunder) - Refactor `redis_replicaof_cmd` [659dc763] (Michael Grunder) - Refactor several command handling macros into typesafe static functions - [9802fc0e, 8f0931bb, 7c953d45, 950d2bc7, 601ebbff, c3a71631, b0040514, - fae89fa9, f880e1f7, b90e27f2, 1db39089] (Michael Grunder) - Refactor `EVAL[SHA]` command and add a regression test [6e5faf42] - (Michael Grunder) - New macros REDIS_RESPONSE_ERROR and REDIS_RETURN_ZVAL [614b86e4] - (JakubOnderka) - Remove wrapper macro which hides branching logic [58e1a04f] (Michael Grunder) - Use continue not break if we get a NULL node [8685c49c] (Michael Grunder) - Remove pointless casts [03837f02] (Michael Grunder) - Change `int` flags to `zend_bool` since we only use them as booleans - [77691947] (Michael Grunder) - Remove unused macros + simplify some logic [75acbb09] (Michael Grunder) @@ -236,6 +146,35 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + stable + stable + + + 6.3.0 + 6.2.0 + + 2025-11-06 + --- 6.3.0 --- + --- Sponsors --- + + A-VISION Advertising - https://github.com/A-VISION-BV + Avtandil Kikabidze - https://github.com/akalongman + Geoffrey Hoffman - https://github.com/phpguru + Object Cache Pro for WordPress - https://objectcache.pro/ + Open LMS - https://openlms.net/ + Relay - https://relay.so) + Salvatore Sanfilippo - https://github.com/antirez + Ty Karok - https://github.com/karock + + Fixed: + + * Cloning our objects should not segfault [770034cc] (michael-grunder) + * Fix return type for `RedisCluster` `vgetattr` and `vsetattr` + [834d2b37] (michael-grunder) + + beta diff --git a/php_redis.h b/php_redis.h index 83472647b2..b7c95e3e71 100644 --- a/php_redis.h +++ b/php_redis.h @@ -23,7 +23,7 @@ #define PHP_REDIS_H /* phpredis version */ -#define PHP_REDIS_VERSION "6.3.0RC1" +#define PHP_REDIS_VERSION "6.3.0" /* For convenience we store the salt as a printable hex string which requires 2 * characters per byte + 1 for the NULL terminator */ diff --git a/redis.c b/redis.c index 662f18aefa..f300fb468e 100644 --- a/redis.c +++ b/redis.c @@ -217,6 +217,7 @@ create_redis_object(zend_class_entry *ce) memcpy(&redis_object_handlers, zend_get_std_object_handlers(), sizeof(redis_object_handlers)); redis_object_handlers.offset = XtOffsetOf(redis_object, std); redis_object_handlers.free_obj = free_redis_object; + redis_object_handlers.clone_obj = NULL; redis->std.handlers = &redis_object_handlers; return &redis->std; diff --git a/redis_array.c b/redis_array.c index bc64047509..ea4b3d766c 100644 --- a/redis_array.c +++ b/redis_array.c @@ -121,6 +121,7 @@ create_redis_array_object(zend_class_entry *ce) memcpy(&redis_array_object_handlers, zend_get_std_object_handlers(), sizeof(redis_array_object_handlers)); redis_array_object_handlers.offset = XtOffsetOf(redis_array_object, std); redis_array_object_handlers.free_obj = free_redis_array_object; + redis_array_object_handlers.clone_obj = NULL; obj->std.handlers = &redis_array_object_handlers; return &obj->std; diff --git a/redis_cluster.c b/redis_cluster.c index 6d7768d5f5..427987f874 100644 --- a/redis_cluster.c +++ b/redis_cluster.c @@ -209,6 +209,7 @@ zend_object * create_cluster_context(zend_class_entry *class_type) { memcpy(&RedisCluster_handlers, zend_get_std_object_handlers(), sizeof(RedisCluster_handlers)); RedisCluster_handlers.offset = XtOffsetOf(redisCluster, std); RedisCluster_handlers.free_obj = free_cluster_context; + RedisCluster_handlers.clone_obj = NULL; cluster->std.handlers = &RedisCluster_handlers; diff --git a/redis_cluster.stub.php b/redis_cluster.stub.php index 63ba4d23a0..317e784c20 100644 --- a/redis_cluster.stub.php +++ b/redis_cluster.stub.php @@ -1139,12 +1139,12 @@ public function vlinks(string $key, mixed $member, bool $withscores = false): Re /** * @see Redis::vgetattr */ - public function vgetattr(string $key, mixed $member, bool $decode = true): Redis|array|string|false; + public function vgetattr(string $key, mixed $member, bool $decode = true): RedisCluster|array|string|false; /** * @see Redis::vsetattr */ - public function vsetattr(string $key, mixed $member, array|string $attributes): Redis|int|false; + public function vsetattr(string $key, mixed $member, array|string $attributes): RedisCluster|int|false; /** * @see Redis::xack diff --git a/redis_cluster_arginfo.h b/redis_cluster_arginfo.h index d6cfd44f09..783cde1109 100644 --- a/redis_cluster_arginfo.h +++ b/redis_cluster_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 6561a50ccac9841ac01a53feb5f88e7f592e1bc2 */ + * Stub hash: 393dc58ed5ca0ea338fec43c4bd7b3b6c01235b5 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1) @@ -934,13 +934,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_vlinks, 0 ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, withscores, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_vgetattr, 0, 2, Redis, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_vgetattr, 0, 2, RedisCluster, MAY_BE_ARRAY|MAY_BE_STRING|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, member, IS_MIXED, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, decode, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_vsetattr, 0, 3, Redis, MAY_BE_LONG|MAY_BE_FALSE) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_vsetattr, 0, 3, RedisCluster, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, member, IS_MIXED, 0) ZEND_ARG_TYPE_MASK(0, attributes, MAY_BE_ARRAY|MAY_BE_STRING, NULL) diff --git a/redis_cluster_legacy_arginfo.h b/redis_cluster_legacy_arginfo.h index d61b36e6bb..6aae92d228 100644 --- a/redis_cluster_legacy_arginfo.h +++ b/redis_cluster_legacy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 6561a50ccac9841ac01a53feb5f88e7f592e1bc2 */ + * Stub hash: 393dc58ed5ca0ea338fec43c4bd7b3b6c01235b5 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_INFO(0, name)