public function work() { foreach ($this->limits as $index => $limit) { $counterName = "queue:{$this->tube}:throttle:{$index}"; $started = (bool) $this->redis->setnx($counterName, $limit['requests']); $counter = $this->redis->get($counterName); if ($started) { $this->redis->transaction(function (MultiExec $transaction) use($counterName, $limit) { $transaction->expire($counterName, $limit['seconds']); $transaction->decr($counterName); }); } else { if ($counter > 1) { $this->redis->decr($counterName); } else { $this->pheanstalk->pauseTube($this->tube, $this->redis->ttl($counterName)); } } } }