diff options
author | michael-grunder <michael.grunder@gmail.com> | 2017-10-24 23:42:02 +0300 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2017-10-24 23:42:02 +0300 |
commit | 29ecb049812db01de1d785ee1cc304fad1533185 (patch) | |
tree | a5414e2dccf1591b627e0075e238fc1d2680e81a /redis_commands.c | |
parent | a4804add7b0988edd404199fb7b64aedfbd2c675 (diff) | |
parent | 68c58513183eaf71dd984870e7b180265323c2bc (diff) |
Merge remote-tracking branch 'git-hulk/feature/tcp-keepalive' into develop
Diffstat (limited to 'redis_commands.c')
-rw-r--r-- | redis_commands.c | 28 |
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) { |