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:
authormichael-grunder <michael.grunder@gmail.com>2017-10-24 23:42:02 +0300
committermichael-grunder <michael.grunder@gmail.com>2017-10-24 23:42:02 +0300
commit29ecb049812db01de1d785ee1cc304fad1533185 (patch)
treea5414e2dccf1591b627e0075e238fc1d2680e81a /redis_commands.c
parenta4804add7b0988edd404199fb7b64aedfbd2c675 (diff)
parent68c58513183eaf71dd984870e7b180265323c2bc (diff)
Merge remote-tracking branch 'git-hulk/feature/tcp-keepalive' into develop
Diffstat (limited to 'redis_commands.c')
-rw-r--r--redis_commands.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/redis_commands.c b/redis_commands.c
index 26cd9f9d..5e25a3fe 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -23,6 +23,10 @@
#endif
#include "redis_commands.h"
+
+#include "php_network.h"
+#include <netinet/tcp.h> /* TCP_KEEPALIVE */
+
#include <zend_exceptions.h>
/* Local passthrough macro for command construction. Given that these methods
@@ -3038,6 +3042,8 @@ void redis_getoption_handler(INTERNAL_FUNCTION_PARAMETERS,
RETURN_NULL();
case REDIS_OPT_READ_TIMEOUT:
RETURN_DOUBLE(redis_sock->read_timeout);
+ case REDIS_OPT_TCP_KEEPALIVE:
+ RETURN_LONG(redis_sock->tcp_keepalive);
case REDIS_OPT_SCAN:
RETURN_LONG(redis_sock->scan);
case REDIS_OPT_FAILOVER:
@@ -3055,6 +3061,8 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
char *val_str;
struct timeval read_tv;
strlen_t val_len;
+ int tcp_keepalive = 0;
+ php_netstream_data_t *sock;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &option,
&val_str, &val_len) == FAILURE)
@@ -3105,6 +3113,26 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
&read_tv);
}
RETURN_TRUE;
+ case REDIS_OPT_TCP_KEEPALIVE:
+
+ /* Don't set TCP_KEEPALIVE if we're using a unix socket. */
+ if (ZSTR_VAL(redis_sock->host)[0] == '/' && redis_sock->port < 1) {
+ RETURN_FALSE;
+ }
+ tcp_keepalive = atol(val_str) > 0 ? 1 : 0;
+ if (redis_sock->tcp_keepalive == tcp_keepalive) {
+ RETURN_TRUE;
+ }
+ if(redis_sock->stream) {
+ /* set TCP_KEEPALIVE */
+ sock = (php_netstream_data_t*)redis_sock->stream->abstract;
+ if (setsockopt(sock->socket, SOL_SOCKET, SO_KEEPALIVE, (const void*) &tcp_keepalive,
+ sizeof(int)) == -1) {
+ RETURN_FALSE;
+ }
+ redis_sock->tcp_keepalive = tcp_keepalive;
+ }
+ RETURN_TRUE;
case REDIS_OPT_SCAN:
val_long = atol(val_str);
if(val_long==REDIS_SCAN_NORETRY || val_long==REDIS_SCAN_RETRY) {