Skip to content

Commit a647755

Browse files
committed
Fixed residual state on pconnect().
Fixes GitHub issue phpredis#94.
1 parent b5ca9a3 commit a647755

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

library.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,30 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
838838
return 0;
839839
}
840840

841+
PHPAPI void redis_send_discard(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock)
842+
{
843+
char *cmd;
844+
int response_len, cmd_len;
845+
char * response;
846+
847+
cmd_len = redis_cmd_format_static(&cmd, "DISCARD", "");
848+
849+
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
850+
efree(cmd);
851+
RETURN_FALSE;
852+
}
853+
efree(cmd);
854+
855+
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
856+
RETURN_FALSE;
857+
}
858+
859+
if(response_len == 3 && strncmp(response, "+OK", 3) == 0) {
860+
RETURN_TRUE;
861+
}
862+
RETURN_FALSE;
863+
}
864+
841865
/**
842866
* redis_sock_read_multibulk_reply
843867
*/

redis.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,14 @@ PHP_METHOD(Redis, pconnect)
446446
if (redis_connect(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1) == FAILURE) {
447447
RETURN_FALSE;
448448
} else {
449+
/* reset multi/exec state if there is one. */
450+
RedisSock *redis_sock;
451+
if (redis_sock_get(getThis(), &redis_sock TSRMLS_CC) < 0) {
452+
RETURN_FALSE;
453+
}
454+
/* clean up eventual residual state from previous request */
455+
redis_send_discard(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
456+
449457
RETURN_TRUE;
450458
}
451459
}
@@ -4586,9 +4594,6 @@ PHP_METHOD(Redis, multi)
45864594
PHP_METHOD(Redis, discard)
45874595
{
45884596
RedisSock *redis_sock;
4589-
char *cmd;
4590-
int response_len, cmd_len;
4591-
char * response;
45924597
zval *object;
45934598

45944599
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
@@ -4601,24 +4606,9 @@ PHP_METHOD(Redis, discard)
46014606
}
46024607

46034608
redis_sock->mode = ATOMIC;
4604-
4605-
cmd_len = redis_cmd_format_static(&cmd, "DISCARD", "");
4606-
4607-
if (redis_sock_write(redis_sock, cmd, cmd_len TSRMLS_CC) < 0) {
4608-
efree(cmd);
4609-
RETURN_FALSE;
4610-
}
4611-
efree(cmd);
4612-
4613-
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
4614-
RETURN_FALSE;
4615-
}
4616-
4617-
if(response_len == 3 && strncmp(response, "+OK", 3) == 0) {
4618-
RETURN_TRUE;
4619-
}
4620-
RETURN_FALSE;
4609+
redis_send_discard(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
46214610
}
4611+
46224612
PHPAPI int redis_sock_read_multibulk_pipeline_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock)
46234613
{
46244614
zval *z_tab;

0 commit comments

Comments
 (0)