2323#endif
2424
2525#include "redis_commands.h"
26+
27+ #include "php_network.h"
28+ #include <netinet/tcp.h> /* TCP_KEEPALIVE */
29+
2630#include <zend_exceptions.h>
2731
2832/* Local passthrough macro for command construction. Given that these methods
@@ -3019,6 +3023,8 @@ void redis_getoption_handler(INTERNAL_FUNCTION_PARAMETERS,
30193023 RETURN_NULL ();
30203024 case REDIS_OPT_READ_TIMEOUT :
30213025 RETURN_DOUBLE (redis_sock -> read_timeout );
3026+ case REDIS_OPT_TCP_KEEPALIVE :
3027+ RETURN_LONG (redis_sock -> tcp_keepalive );
30223028 case REDIS_OPT_SCAN :
30233029 RETURN_LONG (redis_sock -> scan );
30243030 case REDIS_OPT_FAILOVER :
@@ -3036,6 +3042,8 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
30363042 char * val_str ;
30373043 struct timeval read_tv ;
30383044 strlen_t val_len ;
3045+ int tcp_keepalive = 0 ;
3046+ php_netstream_data_t * sock ;
30393047
30403048 if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "ls" , & option ,
30413049 & val_str , & val_len ) == FAILURE )
@@ -3086,6 +3094,26 @@ void redis_setoption_handler(INTERNAL_FUNCTION_PARAMETERS,
30863094 & read_tv );
30873095 }
30883096 RETURN_TRUE ;
3097+ case REDIS_OPT_TCP_KEEPALIVE :
3098+
3099+ /* Don't set TCP_KEEPALIVE if we're using a unix socket. */
3100+ if (ZSTR_VAL (redis_sock -> host )[0 ] == '/' && redis_sock -> port < 1 ) {
3101+ RETURN_FALSE ;
3102+ }
3103+ tcp_keepalive = atol (val_str ) > 0 ? 1 : 0 ;
3104+ if (redis_sock -> tcp_keepalive == tcp_keepalive ) {
3105+ RETURN_TRUE ;
3106+ }
3107+ if (redis_sock -> stream ) {
3108+ /* set TCP_KEEPALIVE */
3109+ sock = (php_netstream_data_t * )redis_sock -> stream -> abstract ;
3110+ if (setsockopt (sock -> socket , SOL_SOCKET , SO_KEEPALIVE , (const void * ) & tcp_keepalive ,
3111+ sizeof (int )) == -1 ) {
3112+ RETURN_FALSE ;
3113+ }
3114+ redis_sock -> tcp_keepalive = tcp_keepalive ;
3115+ }
3116+ RETURN_TRUE ;
30893117 case REDIS_OPT_SCAN :
30903118 val_long = atol (val_str );
30913119 if (val_long == REDIS_SCAN_NORETRY || val_long == REDIS_SCAN_RETRY ) {
0 commit comments