diff options
| author | Remi Collet <remi@remirepo.net> | 2025-10-03 12:11:34 +0200 | 
|---|---|---|
| committer | Remi Collet <remi@php.net> | 2025-10-03 12:11:34 +0200 | 
| commit | c22a99058db7d1749c2bd895be0efdd343376c05 (patch) | |
| tree | 445ddddcf9f03a35dcb8bcc9b82a256c02df4313 | |
| parent | 033f7af78ce5cdfef98f1a323e4a7955ffaf5e27 (diff) | |
test build for upcoming 6.3.0RC1
| -rw-r--r-- | 2677.patch | 22 | ||||
| -rw-r--r-- | PHPINFO | 3 | ||||
| -rw-r--r-- | REFLECTION | 512 | ||||
| -rw-r--r-- | php-pecl-redis6.spec | 16 | ||||
| -rw-r--r-- | redis-8.0.patch | 122 | 
5 files changed, 517 insertions, 158 deletions
diff --git a/2677.patch b/2677.patch deleted file mode 100644 index 57d9da4..0000000 --- a/2677.patch +++ /dev/null @@ -1,22 +0,0 @@ -From f20f46525ff36cce29d61ae074c416b4673d3bd8 Mon Sep 17 00:00:00 2001 -From: Remi Collet <remi@remirepo.net> -Date: Wed, 30 Jul 2025 13:29:27 +0200 -Subject: [PATCH] use Zend/zend_smart_string.h - ---- - common.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/common.h b/common.h -index 57e2903b81..7a7ee67b6a 100644 ---- a/common.h -+++ b/common.h -@@ -11,7 +11,7 @@ - #include <ext/standard/php_var.h> - #include <ext/standard/php_math.h> - #include <zend_smart_str.h> --#include <ext/standard/php_smart_string.h> -+#include <zend_smart_string.h> -  - #define PHPREDIS_GET_OBJECT(class_entry, o) (class_entry *)((char *)o - XtOffsetOf(class_entry, std)) - #define PHPREDIS_ZVAL_GET_OBJECT(class_entry, z) PHPREDIS_GET_OBJECT(class_entry, Z_OBJ_P(z)) @@ -2,7 +2,7 @@  redis  Redis Support => enabled -Redis Version => 6.2.0 +Redis Version => 6.3.0RC1  Redis Sentinel Version => 1.0  Available serializers => php, json, igbinary, msgpack  Available compression => lzf, zstd, lz4 @@ -39,6 +39,7 @@ redis.session.locking_enabled => 0 => 0  redis.session.lock_expire => 0 => 0  redis.session.lock_retries => 100 => 100  redis.session.lock_wait_time => 20000 => 20000 +redis.session.lock_failure_readonly => 0 => 0  redis.session.early_refresh => 0 => 0  redis.session.compression => none => none  redis.session.compression_level => 3 => 3 @@ -1,4 +1,4 @@ -Extension [ <persistent> extension #136 redis version 6.2.0 ] { +Extension [ <persistent> extension #143 redis version 6.3.0RC1 ] {    - Dependencies {      Dependency [ igbinary (Required) ] @@ -101,6 +101,9 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {      Entry [ redis.session.lock_wait_time <ALL> ]        Current = '20000'      } +    Entry [ redis.session.lock_failure_readonly <ALL> ] +      Current = '0' +    }      Entry [ redis.session.early_refresh <ALL> ]        Current = '0'      } @@ -115,7 +118,7 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {    - Classes [6] {      Class [ <internal:redis> class Redis ] { -      - Constants [51] { +      - Constants [52] {          Constant [ public int REDIS_NOT_FOUND ] { 0 }          Constant [ public int REDIS_STRING ] { 1 }          Constant [ public int REDIS_SET ] { 2 } @@ -123,6 +126,7 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {          Constant [ public int REDIS_ZSET ] { 4 }          Constant [ public int REDIS_HASH ] { 5 }          Constant [ public int REDIS_STREAM ] { 6 } +        Constant [ public int REDIS_VECTORSET ] { 7 }          Constant [ public int ATOMIC ] { 0 }          Constant [ public int MULTI ] { 1 }          Constant [ public int PIPELINE ] { 2 } @@ -178,7 +182,7 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {        - Properties [0] {        } -      - Methods [260] { +      - Methods [286] {          Method [ <internal:redis, ctor> public method __construct ] {            - Parameters [1] { @@ -532,6 +536,15 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ Redis|int|false ]          } +        Method [ <internal:redis> public method delifeq ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $value ] +          } +          - Return [ Redis|int|false ] +        } +          Method [ <internal, deprecated:redis> public method delete ] {            - Parameters [2] { @@ -1080,6 +1093,35 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ Redis|array|false ]          } +        Method [ <internal:redis> public method hgetex ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +            Parameter #2 [ <optional> array|string|null $expiry = null ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hsetex ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +            Parameter #2 [ <optional> ?array $expiry = null ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method hgetdel ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } +          Method [ <internal:redis> public method hMset ] {            - Parameters [2] { @@ -1134,6 +1176,95 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ Redis|array|false ]          } +        Method [ <internal:redis> public method hexpire ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $ttl ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hpexpire ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $ttl ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hexpireat ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $time ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hpexpireat ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $mstime ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method httl ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hpttl ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hexpiretime ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hpexpiretime ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method hpersist ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ Redis|array|false ] +        } +          Method [ <internal:redis> public method hscan ] {            - Parameters [4] { @@ -2295,6 +2426,129 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ Redis|array|bool ]          } +        Method [ <internal:redis> public method vadd ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $values ] +            Parameter #2 [ <required> mixed $element ] +            Parameter #3 [ <optional> ?array $options = null ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method vsim ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> ?array $options = null ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method vcard ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method vdim ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method vinfo ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method vismember ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +          } +          - Return [ Redis|bool ] +        } + +        Method [ <internal:redis> public method vemb ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $raw = false ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method vrandmember ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <optional> int $count = 0 ] +          } +          - Return [ Redis|array|string|false ] +        } + +        Method [ <internal:redis> public method vrange ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> string $min ] +            Parameter #2 [ <required> string $max ] +            Parameter #3 [ <optional> int $count = -1 ] +          } +          - Return [ Redis|array|false ] +        } + +        Method [ <internal:redis> public method vrem ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method vsetattr ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <required> array|string $attributes ] +          } +          - Return [ Redis|int|false ] +        } + +        Method [ <internal:redis> public method vgetattr ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $decode = true ] +          } +          - Return [ Redis|array|string|false ] +        } + +        Method [ <internal:redis> public method vlinks ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $withscores = false ] +          } +          - Return [ Redis|array|false ] +        } +          Method [ <internal:redis> public method xtrim ] {            - Parameters [5] { @@ -2909,7 +3163,7 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {        - Properties [0] {        } -      - Methods [228] { +      - Methods [254] {          Method [ <internal:redis, ctor> public method __construct ] {            - Parameters [7] { @@ -3294,6 +3548,15 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ RedisCluster|int|false ]          } +        Method [ <internal:redis> public method delifeq ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $value ] +          } +          - Return [ RedisCluster|int|false ] +        } +          Method [ <internal:redis> public method discard ] {            - Parameters [0] { @@ -3743,6 +4006,35 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ RedisCluster|array|false ]          } +        Method [ <internal:redis> public method hgetex ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +            Parameter #2 [ <optional> array|string|null $expiry = null ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hsetex ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +            Parameter #2 [ <optional> ?array $expiry = null ] +          } +          - Return [ RedisCluster|int|false ] +        } + +        Method [ <internal:redis> public method hgetdel ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } +          Method [ <internal:redis> public method hmset ] {            - Parameters [2] { @@ -3822,6 +4114,95 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ RedisCluster|int|false ]          } +        Method [ <internal:redis> public method hexpire ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $ttl ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hpexpire ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $ttl ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hexpireat ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $time ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hpexpireat ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> int $mstime ] +            Parameter #2 [ <required> array $fields ] +            Parameter #3 [ <optional> ?string $mode = NULL ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method httl ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hpttl ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hexpiretime ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hpexpiretime ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method hpersist ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $fields ] +          } +          - Return [ RedisCluster|array|false ] +        } +          Method [ <internal:redis> public method hvals ] {            - Parameters [1] { @@ -4601,6 +4982,129 @@ Extension [ <persistent> extension #136 redis version 6.2.0 ] {            - Return [ RedisCluster|bool ]          } +        Method [ <internal:redis> public method vadd ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> array $values ] +            Parameter #2 [ <required> mixed $element ] +            Parameter #3 [ <optional> ?array $options = null ] +          } +          - Return [ RedisCluster|int|false ] +        } + +        Method [ <internal:redis> public method vsim ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> ?array $options = null ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method vcard ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ RedisCluster|int|false ] +        } + +        Method [ <internal:redis> public method vdim ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ RedisCluster|int|false ] +        } + +        Method [ <internal:redis> public method vinfo ] { + +          - Parameters [1] { +            Parameter #0 [ <required> string $key ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method vismember ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +          } +          - Return [ RedisCluster|bool ] +        } + +        Method [ <internal:redis> public method vemb ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $raw = false ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method vrandmember ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <optional> int $count = 0 ] +          } +          - Return [ RedisCluster|array|string|false ] +        } + +        Method [ <internal:redis> public method vrange ] { + +          - Parameters [4] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> string $min ] +            Parameter #2 [ <required> string $max ] +            Parameter #3 [ <optional> int $count = -1 ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method vrem ] { + +          - Parameters [2] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +          } +          - Return [ RedisCluster|int|false ] +        } + +        Method [ <internal:redis> public method vlinks ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $withscores = false ] +          } +          - Return [ RedisCluster|array|false ] +        } + +        Method [ <internal:redis> public method vgetattr ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <optional> bool $decode = true ] +          } +          - Return [ Redis|array|string|false ] +        } + +        Method [ <internal:redis> public method vsetattr ] { + +          - Parameters [3] { +            Parameter #0 [ <required> string $key ] +            Parameter #1 [ <required> mixed $member ] +            Parameter #2 [ <required> array|string $attributes ] +          } +          - Return [ Redis|int|false ] +        } +          Method [ <internal:redis> public method xack ] {            - Parameters [3] { diff --git a/php-pecl-redis6.spec b/php-pecl-redis6.spec index e68b245..5061d78 100644 --- a/php-pecl-redis6.spec +++ b/php-pecl-redis6.spec @@ -29,22 +29,19 @@  # after 20-json, 40-igbinary and 40-msgpack  %global ini_name     50-%{pecl_name}.ini -%global upstream_version 6.2.0 -#global upstream_prever  RC2 +%global upstream_version 6.3.0 +%global upstream_prever  RC1  %global sources          %{pecl_name}-%{upstream_version}%{?upstream_prever}  %global _configure       ../%{sources}/configure  Summary:       PHP extension for interfacing with key-value stores  Name:          %{?scl_prefix}php-pecl-redis6  Version:       %{upstream_version}%{?upstream_prever:~%{upstream_prever}} -Release:       4%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Release:       0%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}}  License:       PHP-3.01  URL:           https://pecl.php.net/package/redis  Source0:       https://pecl.php.net/get/%{sources}.tgz -Patch0:        redis-8.0.patch -Patch1:        2677.patch -  BuildRequires: make  BuildRequires: %{?dtsprefix}gcc  BuildRequires: %{?scl_prefix}php-devel >= 7.4 @@ -145,9 +142,6 @@ sed -e 's/role="test"/role="src"/' \      -i package.xml  cd %{sources} -%patch -P0 -p1 -%patch -P1 -p1 -  # Use system library  rm -r liblzf @@ -211,6 +205,7 @@ extension = %{pecl_name}.so  ;redis.session.lock_expire = 0  ;redis.session.lock_retries = 100  ;redis.session.lock_wait_time = 20000 +;redis.session.lock_failure_readonly = 0  ;redis.session.early_refresh = 0  ;redis.session.compression = none  ;redis.session.compression_level = 3 @@ -358,6 +353,9 @@ exit $ret  %changelog +* Fri Oct  3 2025 Remi Collet <remi@remirepo.net> - 6.3.0~RC1-0 +- test build for upcoming 6.3.0RC1 +  * Thu Sep 25 2025 Remi Collet <remi@remirepo.net> - 6.2.0-4  - rebuild for PHP 8.5.0RC1 diff --git a/redis-8.0.patch b/redis-8.0.patch deleted file mode 100644 index fd713c5..0000000 --- a/redis-8.0.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 593ba012ac49065343f6bbf10adca5047414ce85 Mon Sep 17 00:00:00 2001 -From: michael-grunder <michael.grunder@gmail.com> -Date: Sun, 4 May 2025 10:20:01 -0700 -Subject: [PATCH] Check for `dragonfly_version` in `HELLO` response - -DragonflyDB will report to be Redis but also include `dragonfly_version` -in the hello response, which we can use to identify the fork. - -Also fix parsing of the `HELLO` response for `serverName()` and -`serverVersion()`. Starting in Redis 8.0 there seem to always be modules -running, which the previous function was not expecting or parsing. ---- - library.c           | 39 ++++++++++++++++++++++++++------------- - redis.c             |  2 +- - tests/RedisTest.php |  2 ++ - 3 files changed, 29 insertions(+), 14 deletions(-) - -diff --git a/library.c b/library.c -index a9fb523e48..ce3e2672d0 100644 ---- a/library.c -+++ b/library.c -@@ -2018,26 +2018,31 @@ static int - redis_hello_response(INTERNAL_FUNCTION_PARAMETERS, -                      RedisSock *redis_sock, zval *z_tab, void *ctx) - { --    int numElems; -     zval z_ret, *zv; -+    int numElems; -  --    if (read_mbulk_header(redis_sock, &numElems) < 0) { --        if (IS_ATOMIC(redis_sock)) { --            RETVAL_FALSE; --        } else { --            add_next_index_bool(z_tab, 0); --        } --        return FAILURE; --    } -+    if (read_mbulk_header(redis_sock, &numElems) < 0) -+        goto fail; -  -     array_init(&z_ret); --    redis_mbulk_reply_zipped_raw_variant(redis_sock, &z_ret, numElems); -+ -+    if (redis_read_multibulk_recursive(redis_sock, numElems, 0, &z_ret) != SUCCESS || -+        array_zip_values_recursive(&z_ret) != SUCCESS)  -+    { -+        zval_dtor(&z_ret); -+        goto fail; -+    } -  -     if (redis_sock->hello.server) { -         zend_string_release(redis_sock->hello.server); -     } --    zv = zend_hash_str_find(Z_ARRVAL(z_ret), ZEND_STRL("server")); --    redis_sock->hello.server = zv ? zval_get_string(zv) : ZSTR_EMPTY_ALLOC(); -+ -+    if ((zv = zend_hash_str_find(Z_ARRVAL(z_ret), ZEND_STRL("dragonfly_version")))) { -+        redis_sock->hello.server = zend_string_init(ZEND_STRL("dragonfly"), 0); -+    } else { -+        zv = zend_hash_str_find(Z_ARRVAL(z_ret), ZEND_STRL("server")); -+        redis_sock->hello.server = zv ? zval_get_string(zv) : ZSTR_EMPTY_ALLOC(); -+    } -  -     if (redis_sock->hello.version) { -         zend_string_release(redis_sock->hello.version); -@@ -2063,6 +2068,14 @@ redis_hello_response(INTERNAL_FUNCTION_PARAMETERS, -     } -  -     return SUCCESS; -+ -+fail: -+    if (IS_ATOMIC(redis_sock)) { -+        RETVAL_FALSE; -+    } else { -+        add_next_index_bool(z_tab, 0); -+    } -+    return FAILURE; - } -  -  -@@ -4302,7 +4315,7 @@ redis_read_multibulk_recursive(RedisSock *redis_sock, long long elements, int st -         elements--; -     } -  --    return 0; -+    return SUCCESS; - } -  - static int -diff --git a/redis.c b/redis.c -index 3f13a59888..629dd5c20b 100644 ---- a/redis.c -+++ b/redis.c -@@ -2131,7 +2131,7 @@ redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETERS, -  -         int num = atol(inbuf + 1); -  --        if (num > 0 && redis_read_multibulk_recursive(redis_sock, num, 0, &z_ret) < 0) { -+        if (num > 0 && redis_read_multibulk_recursive(redis_sock, num, 0, &z_ret) != SUCCESS) { -             return FAILURE; -         } -     } -diff --git a/tests/RedisTest.php b/tests/RedisTest.php -index e7854da442..1ebcc61e51 100644 ---- a/tests/RedisTest.php -+++ b/tests/RedisTest.php -@@ -2476,6 +2476,7 @@ public function testServerInfo() { -             $this->markTestSkipped(); -  -         $hello = $this->execHello(); -+ -         if ( ! $this->assertArrayKey($hello, 'server') || -              ! $this->assertArrayKey($hello, 'version')) -         { -@@ -2486,6 +2487,7 @@ public function testServerInfo() { -         $this->assertEquals($hello['version'], $this->redis->serverVersion()); -  -         $info = $this->redis->info(); -+ -         $cmd1 = $info['total_commands_processed']; -  -         /* Shouldn't hit the server */  | 
