8000 add Redis::OPT_READ_TIMEOUT option for issue #70 · jrtkcoder/phpredis@3764a6c · GitHub
[go: up one dir, main page]

Skip to content

Commit 3764a6c

Browse files
committed
add Redis::OPT_READ_TIMEOUT option for issue phpredis#70
1 parent 7dfac44 commit 3764a6c

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ typedef enum _REDIS_REPLY_TYPE {
3434
/* options */
3535
#define REDIS_OPT_SERIALIZER 1
3636
#define REDIS_OPT_PREFIX 2
37+
#define REDIS_OPT_READ_TIMEOUT 3
3738

3839
/* serializers */
3940
#define REDIS_SERIALIZER_NONE 0
@@ -156,6 +157,7 @@ typedef struct {
156157
char *host;
157158
short port;
158159
double timeout;
160+
double read_timeout;
159161
int failed;
160162
int status;
161163
int persistent;

library.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,7 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
841841

842842
redis_sock->port = port;
843843
redis_sock->timeout = timeout;
844+
redis_sock->read_timeout = timeout;
844845

845846
redis_sock->serializer = REDIS_SERIALIZER_NONE;
846847
redis_sock->mode = ATOMIC;
@@ -860,7 +861,7 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
860861
*/
861862
PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC)
862863
{
863-
struct timeval tv, *tv_ptr = NULL;
864+
struct timeval tv, read_tv, *tv_ptr = NULL;
864865
char *host = NULL, *persistent_id = NULL, *errstr = NULL;
865866
int host_len, err = 0;
866867
php_netstream_data_t *sock;
@@ -876,6 +877,9 @@ PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC)
876877
tv_ptr = &tv;
877878
}
878879

880+
read_tv.tv_sec = (time_t)redis_sock->read_timeout;
881+
read_tv.tv_usec = (int)((redis_sock->read_timeout - read_tv.tv_sec) * 1000000);
882+
879883
if(redis_sock->host[0] == '/' && redis_sock->port < 1) {
880884
host_len = spprintf(&host, 0, "unix://%s", redis_sock->host);
881885
} else {
@@ -915,9 +919,9 @@ PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC)
915919

916920
php_stream_auto_cleanup(redis_sock->stream);
917921

918-
if(tv.tv_sec != 0) {
922+
if(read_tv.tv_sec != 0) {
919923
php_stream_set_option(redis_sock->stream, PHP_STREAM_OPTION_READ_TIMEOUT,
920-
0, &tv);
924+
0, &read_tv);
921925
}
922926
php_stream_set_option(redis_sock->stream,
923927
PHP_STREAM_OPTION_WRITE_BUFFER,

redis.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ PHP_MINIT_FUNCTION(redis)
434434
/* options */
435435
add_constant_long(redis_ce, "OPT_SERIALIZER", REDIS_OPT_SERIALIZER);
436436
add_constant_long(redis_ce, "OPT_PREFIX", REDIS_OPT_PREFIX);
437+
add_constant_long(redis_ce, "OPT_READ_TIMEOUT", REDIS_OPT_READ_TIMEOUT);
437438

438439
/* serializer */
439440
add_constant_long(redis_ce, "SERIALIZER_NONE", REDIS_SERIALIZER_NONE);
@@ -5650,6 +5651,9 @@ PHP_METHOD(Redis, getOption) {
56505651
}
56515652
RETURN_NULL();
56525653

5654+
case REDIS_OPT_READ_TIMEOUT:
5655+
RETURN_DOUBLE(redis_sock->read_timeout);
5656+
56535657
default:
56545658
RETURN_FALSE;
56555659

@@ -5665,6 +5669,7 @@ PHP_METHOD(Redis, setOption) {
56655669
long option, val_long;
56665670
char *val_str;
56675671
int val_len;
5672+
struct timeval read_tv;
56685673

56695674
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols",
56705675
&object, redis_ce, &option, &val_str, &val_len) == FAILURE) {
@@ -5704,6 +5709,16 @@ PHP_METHOD(Redis, setOption) {
57045709
}
57055710
RETURN_TRUE;
57065711

5712+
case REDIS_OPT_READ_TIMEOUT:
5713+
redis_sock->read_timeout = atof(val_str);
5714+
if(redis_sock->stream) {
5715+
read_tv.tv_sec = (time_t)redis_sock->read_timeout;
5716+
read_tv.tv_usec = (int)((redis_sock->read_timeout - read_tv.tv_sec) * 1000000);
5717+
php_stream_set_option(redis_sock->stream, PHP_STREAM_OPTION_READ_TIMEOUT,
5718+
0, &read_tv);
5719+
}
5720+
RETURN_TRUE;
5721+
57075722
default:
57085723
RETURN_FALSE;
57095724
}

tests/TestRedis.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3321,6 +3321,15 @@ public function testTime() {
33213321
strval(intval($time_arr[0])) === strval($time_arr[0]) &&
33223322
strval(intval($time_arr[1])) === strval($time_arr[1]));
33233323
}
3324+
3325+
public function testReadTimeoutOption() {
3326+
3327+
$this->assertTrue(defined('Redis::OPT_READ_TIMEOUT'));
3328+
3329+
$this->redis->setOption(Redis::OPT_READ_TIMEOUT, "12.3");
3330+
$this->assertEquals(12.3, $this->redis->getOption(Redis::OPT_READ_TIMEOUT));
3331+
}
3332+
33243333
}
33253334

33263335
exit(TestSuite::run("Redis_Test"));

0 commit comments

Comments
 (0)
0