@@ -31,24 +31,25 @@ PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC) {
3131
3232PHPAPI int redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
3333{
34-
35- int eof = redis_sock -> stream == NULL ? 1 : php_stream_eof (redis_sock -> stream );
34+ int eof = php_stream_eof (redis_sock -> stream );
3635 int count = 0 ;
3736 while (eof ) {
38- if (count ++ == 10 ) { /* too many failures */
37+ if (( MULTI == redis_sock -> mode ) || redis_sock -> watching || count ++ == 10 ) { /* too many failures */
3938 if (redis_sock -> stream ) { /* close stream if still here */
40- redis_stream_close (redis_sock TSRMLS_CC );
39+ php_stream_close (redis_sock -> stream );
4140 redis_sock -> stream = NULL ;
4241 redis_sock -> mode = ATOMIC ;
4342 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
43+ redis_sock -> watching = 0 ;
4444 }
4545 zend_throw_exception (redis_exception_ce , "Connection lost" , 0 TSRMLS_CC );
4646 return -1 ;
4747 }
4848 if (redis_sock -> stream ) { /* close existing stream before reconnecting */
49- redis_stream_close (redis_sock TSRMLS_CC );
49+ php_stream_close (redis_sock -> stream );
5050 redis_sock -> stream = NULL ;
5151 redis_sock -> mode = ATOMIC ;
52+ redis_sock -> watching = 0 ;
5253 }
5354 redis_sock_connect (redis_sock TSRMLS_CC ); /* reconnect */
5455 if (redis_sock -> stream ) { /* check for EOF again. */
@@ -72,6 +73,7 @@ PHPAPI zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS,
7273 redis_sock -> stream = NULL ;
7374 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
7475 redis_sock -> mode = ATOMIC ;
76+ redis_sock -> watching = 0 ;
7577 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
7678 return NULL ;
7779 }
@@ -146,6 +148,7 @@ PHPAPI char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC)
146148 redis_sock -> stream = NULL ;
147149 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
148150 redis_sock -> mode = ATOMIC ;
151+ redis_sock -> watching = 0 ;
149152 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
150153 return NULL ;
151154 }
@@ -478,7 +481,7 @@ PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
478481 }
479482}
480483
481- PHPAPI void redis_boolean_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
484+ PHPAPI void redis_boolean_response_impl (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx , SuccessCallback success_callback ) {
482485
483486 char * response ;
484487 int response_len ;
@@ -496,19 +499,29 @@ PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redi
496499
497500 IF_MULTI_OR_PIPELINE () {
498501 if (ret == '+' ) {
502+ if (success_callback != NULL ) {
503+ success_callback (redis_sock );
504+ }
499505 add_next_index_bool (z_tab , 1 );
500506 } else {
501507 add_next_index_bool (z_tab , 0 );
502508 }
503509 } else {
504510 if (ret == '+' ) {
511+ if (success_callback != NULL ) {
512+ success_callback (redis_sock );
513+ }
505514 RETURN_TRUE ;
506515 } else {
507516 RETURN_FALSE ;
508517 }
509518 }
510519}
511520
521+ PHPAPI void redis_boolean_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
522+ redis_boolean_response_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , z_tab , ctx , NULL );
523+ }
524+
512525PHPAPI void redis_long_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
513526
514527 char * response ;
@@ -570,6 +583,7 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
570583 redis_sock -> stream = NULL ;
571584 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
572585 redis_sock -> mode = ATOMIC ;
586+ redis_sock -> watching = 0 ;
573587 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
574588 return -1 ;
575589 }
@@ -701,6 +715,7 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
701715 redis_sock -> host = estrndup (host , host_len );
702716 redis_sock -> stream = NULL ;
703717 redis_sock -> status = REDIS_SOCK_STATUS_DISCONNECTED ;
718+ redis_sock -> watching = 0 ;
704719
705720 redis_sock -> persistent = persistent ;
706721
@@ -841,6 +856,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
841856 }
842857
843858 redis_sock -> status = REDIS_SOCK_STATUS_DISCONNECTED ;
859+ redis_sock -> watching = 0 ;
844860 if (redis_sock -> stream && !redis_sock -> persistent ) { /* still valid after the write? */
845861 php_stream_close (redis_sock -> stream );
846862 }
@@ -893,6 +909,7 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
893909 redis_sock -> stream = NULL ;
894910 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
895911 redis_sock -> mode = ATOMIC ;
912+ redis_sock -> watching = 0 ;
896913 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
897914 return -1 ;
898915 }
@@ -934,6 +951,7 @@ PHPAPI int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, Red
934951 redis_sock -> stream = NULL ;
935952 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
936953 redis_sock -> mode = ATOMIC ;
954+ redis_sock -> watching = 0 ;
937955 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
938956 return -1 ;
939957 }
@@ -1007,6 +1025,7 @@ PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, R
10071025 redis_sock -> stream = NULL ;
10081026 redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
10091027 redis_sock -> mode = ATOMIC ;
1028+ redis_sock -> watching = 0 ;
10101029 zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
10111030 return -1 ;
10121031 }
0 commit comments