Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2022-05-27 15:20:19 +0300
committerPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2022-05-27 15:26:39 +0300
commite6b3fe548421b0f555c6d9d94dea4c26640ba716 (patch)
treefd05b81d5ff8663256095550972b6cb02217141d
parenta5c41ceb0fc10f4b63f5681550d6547cb17c8ef3 (diff)
Backoff settings in constructor
-rw-r--r--README.markdown5
-rw-r--r--library.c38
-rw-r--r--library.h1
-rw-r--r--redis.c8
4 files changed, 50 insertions, 2 deletions
diff --git a/README.markdown b/README.markdown
index ec7afd50..5f354763 100644
--- a/README.markdown
+++ b/README.markdown
@@ -161,6 +161,11 @@ $redis = new Redis([
'connectTimeout' => 2.5,
'auth' => ['phpredis', 'phpredis'],
'ssl' => ['verify_peer' => false],
+ 'backoff' => [
+ 'algorithm' => Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER,
+ 'base' => 500,
+ 'cap' => 750,
+ ],
]);
~~~
diff --git a/library.c b/library.c
index 2e428e08..6c2b24de 100644
--- a/library.c
+++ b/library.c
@@ -2589,6 +2589,44 @@ redis_sock_set_stream_context(RedisSock *redis_sock, zval *options)
return SUCCESS;
}
+PHP_REDIS_API int
+redis_sock_set_backoff(RedisSock *redis_sock, zval *options)
+{
+ zend_string *zkey;
+ zend_long val;
+ zval *z_ele;
+
+ if (!redis_sock || Z_TYPE_P(options) != IS_ARRAY) {
+ return FAILURE;
+ }
+
+ ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(options), zkey, z_ele) {
+ if (zkey != NULL) {
+ ZVAL_DEREF(z_ele);
+ if (zend_string_equals_literal_ci(zkey, "algorithm")) {
+ if ((val = zval_get_long(z_ele)) < 0 || val >= REDIS_BACKOFF_ALGORITHMS) {
+ return FAILURE;
+ }
+ redis_sock->backoff.algorithm = val;
+ } else if (zend_string_equals_literal_ci(zkey, "base")) {
+ if ((val = zval_get_long(z_ele)) < 0) {
+ return FAILURE;
+ }
+ redis_sock->backoff.base = val * 1000;
+ } else if (zend_string_equals_literal_ci(zkey, "cap")) {
+ if ((val = zval_get_long(z_ele)) < 0) {
+ return FAILURE;
+ }
+ redis_sock->backoff.cap = val * 1000;
+ } else {
+ php_error_docref(NULL, E_WARNING, "Skip unknown backoff option '%s'", ZSTR_VAL(zkey));
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+
+ return SUCCESS;
+}
+
/**
* redis_sock_read_multibulk_reply
*/
diff --git a/library.h b/library.h
index 8c277b99..cbf26a73 100644
--- a/library.h
+++ b/library.h
@@ -117,6 +117,7 @@ PHP_REDIS_API RedisSock *redis_sock_get(zval *id, int nothrow);
PHP_REDIS_API void redis_free_socket(RedisSock *redis_sock);
PHP_REDIS_API void redis_sock_set_err(RedisSock *redis_sock, const char *msg, int msg_len);
PHP_REDIS_API int redis_sock_set_stream_context(RedisSock *redis_sock, zval *options);
+PHP_REDIS_API int redis_sock_set_backoff(RedisSock *redis_sock, zval *options);
PHP_REDIS_API int
redis_serialize(RedisSock *redis_sock, zval *z, char **val, size_t *val_len);
diff --git a/redis.c b/redis.c
index ade8d3b5..d526b99d 100644
--- a/redis.c
+++ b/redis.c
@@ -650,17 +650,21 @@ PHP_METHOD(Redis, __construct)
}
redis->sock->retry_interval = zval_get_long(val);
} else if (zend_string_equals_literal_ci(zkey, "ssl")) {
- if (Z_TYPE_P(val) != IS_ARRAY) {
+ if (redis_sock_set_stream_context(redis->sock, val) != SUCCESS) {
REDIS_VALUE_EXCEPTION("Invalid SSL context options");
RETURN_THROWS();
}
- redis_sock_set_stream_context(redis->sock, val);
} else if (zend_string_equals_literal_ci(zkey, "auth")) {
if (Z_TYPE_P(val) != IS_STRING && Z_TYPE_P(val) != IS_ARRAY) {
REDIS_VALUE_EXCEPTION("Invalid auth credentials");
RETURN_THROWS();
}
redis_sock_set_auth_zval(redis->sock, val);
+ } else if (zend_string_equals_literal_ci(zkey, "backoff")) {
+ if (redis_sock_set_backoff(redis->sock, val) != SUCCESS) {
+ REDIS_VALUE_EXCEPTION("Invalid backoff options");
+ RETURN_THROWS();
+ }
} else {
php_error_docref(NULL, E_WARNING, "Skip unknown option '%s'", ZSTR_VAL(zkey));
}