diff options
author | git-hulk <hulk.website@gmail.com> | 2017-10-24 08:19:08 +0300 |
---|---|---|
committer | git-hulk <hulk.website@gmail.com> | 2017-10-24 09:44:11 +0300 |
commit | 68c58513183eaf71dd984870e7b180265323c2bc (patch) | |
tree | e3575b5ce4f46ea32db79c8dd0e7cd1684607211 /redis_commands.c | |
parent | 75e7c81dad243eda06c332dcd4c5ecfe2e0c4a68 (diff) |
MOD: Add tcp_keepalive option to redis sock
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 4e88b2f0..434eb215 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 @@ -3019,6 +3023,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: @@ -3036,6 +3042,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) @@ -3086,6 +3094,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) { |