DatabaseUuidFailedJobProvider.php
TLDR
This file, DatabaseUuidFailedJobProvider.php
, is a PHP class that provides functionality for logging and managing failed jobs in a database. It implements several interfaces, including CountableFailedJobProvider
, FailedJobProviderInterface
, and PrunableFailedJobProvider
. The class allows you to log a failed job, retrieve lists of failed jobs, delete individual failed jobs or all failed jobs, and prune old failed job entries.
Methods
log
This method logs a failed job into storage. It takes the connection name, queue name, payload, and exception as parameters and saves them in the database table.
ids
This method retrieves the IDs of all failed jobs. It optionally accepts a queue name as a parameter to filter the results.
all
This method returns a list of all failed jobs.
find
This method retrieves a single failed job by its ID.
forget
This method deletes a single failed job from storage by its ID.
flush
This method deletes all failed jobs from storage. It optionally accepts a number of hours to only delete jobs that failed within the specified time frame.
prune
This method prunes (deletes) all failed job entries older than the specified date.
count
This method counts the number of failed jobs. It optionally accepts connection and queue names as parameters to filter the results.
getTable
This is a protected method that returns a new query builder instance for the database table used by the failed job provider.
<?php
namespace Illuminate\Queue\Failed;
use DateTimeInterface;
use Illuminate\Database\ConnectionResolverInterface;
use Illuminate\Support\Facades\Date;
class DatabaseUuidFailedJobProvider implements CountableFailedJobProvider, FailedJobProviderInterface, PrunableFailedJobProvider
{
/**
* The connection resolver implementation.
*
* @var \Illuminate\Database\ConnectionResolverInterface
*/
protected $resolver;
/**
* The database connection name.
*
* @var string
*/
protected $database;
/**
* The database table.
*
* @var string
*/
protected $table;
/**
* Create a new database failed job provider.
*
* @param \Illuminate\Database\ConnectionResolverInterface $resolver
* @param string $database
* @param string $table
* @return void
*/
public function __construct(ConnectionResolverInterface $resolver, $database, $table)
{
$this->table = $table;
$this->resolver = $resolver;
$this->database = $database;
}
/**
* Log a failed job into storage.
*
* @param string $connection
* @param string $queue
* @param string $payload
* @param \Throwable $exception
* @return string|null
*/
public function log($connection, $queue, $payload, $exception)
{
$this->getTable()->insert([
'uuid' => $uuid = json_decode($payload, true)['uuid'],
'connection' => $connection,
'queue' => $queue,
'payload' => $payload,
'exception' => (string) mb_convert_encoding($exception, 'UTF-8'),
'failed_at' => Date::now(),
]);
return $uuid;
}
/**
* Get the IDs of all of the failed jobs.
*
* @param string|null $queue
* @return array
*/
public function ids($queue = null)
{
return $this->getTable()
->when(! is_null($queue), fn ($query) => $query->where('queue', $queue))
->orderBy('id', 'desc')
->pluck('uuid')
->all();
}
/**
* Get a list of all of the failed jobs.
*
* @return array
*/
public function all()
{
return $this->getTable()->orderBy('id', 'desc')->get()->map(function ($record) {
$record->id = $record->uuid;
unset($record->uuid);
return $record;
})->all();
}
/**
* Get a single failed job.
*
* @param mixed $id
* @return object|null
*/
public function find($id)
{
if ($record = $this->getTable()->where('uuid', $id)->first()) {
$record->id = $record->uuid;
unset($record->uuid);
}
return $record;
}
/**
* Delete a single failed job from storage.
*
* @param mixed $id
* @return bool
*/
public function forget($id)
{
return $this->getTable()->where('uuid', $id)->delete() > 0;
}
/**
* Flush all of the failed jobs from storage.
*
* @param int|null $hours
* @return void
*/
public function flush($hours = null)
{
$this->getTable()->when($hours, function ($query, $hours) {
$query->where('failed_at', '<=', Date::now()->subHours($hours));
})->delete();
}
/**
* Prune all of the entries older than the given date.
*
* @param \DateTimeInterface $before
* @return int
*/
public function prune(DateTimeInterface $before)
{
$query = $this->getTable()->where('failed_at', '<', $before);
$totalDeleted = 0;
do {
$deleted = $query->take(1000)->delete();
$totalDeleted += $deleted;
} while ($deleted !== 0);
return $totalDeleted;
}
/**
* Count the failed jobs.
*
* @param string|null $connection
* @param string|null $queue
* @return int
*/
public function count($connection = null, $queue = null)
{
return $this->getTable()
->when($connection, fn ($builder) => $builder->whereConnection($connection))
->when($queue, fn ($builder) => $builder->whereQueue($queue))
->count();
}
/**
* Get a new query builder instance for the table.
*
* @return \Illuminate\Database\Query\Builder
*/
protected function getTable()
{
return $this->resolver->connection($this->database)->table($this->table);
}
}