Beanstalkd models a job’s lifecycle explicitly, and the three verbs are the whole API worth knowing.
$job = $queue->reserveWithTimeout(5); // mine for TTR seconds
try {
$this->handle($job->getData());
$queue->delete($job); // done, gone
} catch (Transient $e) {
$queue->release($job, 1024, 60); // back to the tube, in 60s
} catch (Throwable $e) {
$queue->bury($job); // set aside for a human
}
A reserved job returns to the ready queue automatically when its time-to-run expires, which is what makes a crashed worker recoverable without any coordination. Buried jobs sit in their own state until somebody kicks them back, which is a dead letter queue built into the server rather than a convention. The distinction between release and bury is the one that matters in a handler: transient failures go back, permanent ones go aside.