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)