/** * Find any delayed jobs and add them to the queue if found * * @param int $endTime optional end time for range * @param int $startTime optional start time for range */ public function queueDelayed($endTime = null, $startTime = 0) { $startTime = $startTime ?: 0; $endTime = $endTime ?: time(); foreach ($this->resolveQueues() as $queue) { $this->redis->multi(); $jobs = $this->redis->zrangebyscore(Queue::redisKey($queue, 'delayed'), $startTime, $endTime); $this->redis->zremrangebyscore(Queue::redisKey($queue, 'delayed'), $startTime, $endTime); list($jobs, $found) = $this->redis->exec(); if ($found > 0) { foreach ($jobs as $payload) { $job = Job::loadPayload($queue, $payload); $job->setWorker($this); if (Event::fire(Event::JOB_QUEUE_DELAYED, $job) !== false) { $job->queue(); Event::fire(Event::JOB_QUEUED_DELAYED, $job); } } Stats::decr('delayed', $found); Stats::decr('delayed', $found, Queue::redisKey($queue, 'stats')); $this->log('Added <pop>' . $found . '</pop> delayed job' . ($found == 1 ? '' : 's') . ' to <pop>' . $queue . '</pop> queue', Logger::NOTICE); } } }
/** * Pop the next job off of the queue. * * @param array $queues Queues to watch for new jobs * @param int $timeout Timeout if blocking * @param bool $blocking Should Redis use blocking * @return Job|false */ public function pop(array $queues, $timeout = 10, $blocking = true) { $queue = $payload = null; foreach ($queues as &$queue) { $queue = self::redisKey($queue); } if ($blocking) { list($queue, $payload) = $this->redis->blpop($queues, $timeout); $queue = $this->redis->removeNamespace($queue); } else { foreach ($queues as $queue) { if ($payload = $this->redis->lpop($queue)) { break; } } } if (!$queue or !$payload) { return false; } $queue = substr($queue, strlen('queue:')); return Job::loadPayload($queue, $payload); }