diff --git a/lib/Predis.php b/lib/Predis.php index 98781aa0..31b0a5b0 100644 --- a/lib/Predis.php +++ b/lib/Predis.php @@ -988,13 +988,16 @@ class PubSubContext implements \Iterator { const MESSAGE = 'message'; const PMESSAGE = 'pmessage'; + const STATUS_VALID = 0x0001; + const STATUS_SUBSCRIBED = 0x0010; + const STATUS_PSUBSCRIBED = 0x0100; + private $_redisClient, $_subscriptions, $_isStillValid, $_position; public function __construct(Client $redisClient) { $this->checkCapabilities($redisClient); - $this->_redisClient = $redisClient; - $this->_isStillValid = true; - $this->_subscriptions = false; + $this->_redisClient = $redisClient; + $this->_statusFlags = self::STATUS_VALID; } public function __destruct() { @@ -1014,9 +1017,13 @@ class PubSubContext implements \Iterator { } } + private function isFlagSet($value) { + return ($this->_statusFlags & $value) === $value; + } + public function subscribe(/* arguments */) { $this->writeCommand(self::SUBSCRIBE, func_get_args()); - $this->_subscriptions = true; + $this->_statusFlags |= self::STATUS_SUBSCRIBED; } public function unsubscribe(/* arguments */) { @@ -1025,7 +1032,7 @@ class PubSubContext implements \Iterator { public function psubscribe(/* arguments */) { $this->writeCommand(self::PSUBSCRIBE, func_get_args()); - $this->_subscriptions = true; + $this->_statusFlags |= self::STATUS_PSUBSCRIBED; } public function punsubscribe(/* arguments */) { @@ -1034,10 +1041,12 @@ class PubSubContext implements \Iterator { public function closeContext() { if ($this->valid()) { - // TODO: as an optimization, we should not send both - // commands if one of them has not been issued. - $this->unsubscribe(); - $this->punsubscribe(); + if ($this->isFlagSet(self::STATUS_SUBSCRIBED)) { + $this->unsubscribe(); + } + if ($this->isFlagSet(self::STATUS_PSUBSCRIBED)) { + $this->punsubscribe(); + } } } @@ -1062,19 +1071,20 @@ class PubSubContext implements \Iterator { } public function next() { - if ($this->_isStillValid) { + if ($this->isFlagSet(self::STATUS_VALID)) { $this->_position++; } return $this->_position; } public function valid() { - return $this->_subscriptions && $this->_isStillValid; + $subscriptions = self::STATUS_SUBSCRIBED + self::STATUS_PSUBSCRIBED; + return $this->isFlagSet(self::STATUS_VALID) + && ($this->_statusFlags & $subscriptions) > 0; } private function invalidate() { - $this->_isStillValid = false; - $this->_subscriptions = false; + $this->_statusFlags = 0x0000; } private function getValue() {