diff --git a/src/queue/src/Worker.php b/src/queue/src/Worker.php index 2d3f93f56..d535368c8 100644 --- a/src/queue/src/Worker.php +++ b/src/queue/src/Worker.php @@ -182,11 +182,11 @@ public function daemon(string $connectionName, string $queue, WorkerOptions $opt if ($job) { ++$jobsProcessed; $concurrent->create(fn () => $this->runJob($job, $connectionName, $options)); - } - if ($job && $options->rest > 0) { - $this->sleep($options->rest); - } elseif (! $job && $jobsProcessed) { + if ($options->rest > 0) { + $this->sleep($options->rest); + } + } else { $this->sleep($options->sleep); } diff --git a/tests/Queue/QueueWorkerTest.php b/tests/Queue/QueueWorkerTest.php index 6fd85c062..66268bddf 100644 --- a/tests/Queue/QueueWorkerTest.php +++ b/tests/Queue/QueueWorkerTest.php @@ -123,6 +123,22 @@ public function testWorkerCanWorkUntilQueueIsEmpty() $this->events->shouldHaveReceived('dispatch')->with(m::type(JobProcessed::class))->twice(); } + public function testDaemonSleepsWhenQueueIsEmptyAtStartup() + { + // Regression: the idle branch must sleep even when $jobsProcessed is still 0 + // (i.e. on the very first loop iteration with an empty queue). + $workerOptions = new WorkerOptions(); + $workerOptions->stopWhenEmpty = true; + $workerOptions->sleep = 5; + + $worker = $this->getWorker('default', ['queue' => []]); + + $status = $worker->daemon('default', 'queue', $workerOptions); + + $this->assertEquals(5, $worker->sleptFor); + $this->assertSame(Worker::EXIT_SUCCESS, $status); + } + public function testWorkerStopsWhenMemoryExceeded() { $workerOptions = new WorkerOptions();