PHP code example of nails / module-queue

1. Go to this page and download the library: Download nails/module-queue library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

nails / module-queue example snippets


namespace Nails\Queue\Interface;

use Nails\Queue\Resource\Worker;

interface Queue
{
    /** Called once on worker startup for each queue */
    public static function setup(Worker $worker): void;

    /** Periodically called by the worker (~every refresh interval) */
    public static function refresh(Worker $worker): void;
}

namespace Nails\Queue\Interface;

interface Task
{
    /** Maximum number of retries for this task */
    public static function getMaxRetries(): int;

    /** Perform the work */
    public function run(Data $data): void;
}

namespace Nails\Queue\Interface;

use stdClass;

interface Data
{
    /** Construct with the payload to persist */
    public function __construct(array|string|int|float|bool|stdClass|null $data);

    /** Retrieve the raw payload */
    public function get(): array|string|int|float|bool|stdClass|null;

    /** JSON representation persisted to DB */
    public function toJson(): string;
}

use Nails\Queue\Service\Manager;
use Nails\Queue\Interface\Task;
use Nails\Queue\Interface\Data;
use Nails\Queue\Interface\Queue;
use Nails\Queue\Resource\Job;

// Factory::service('Manager', \Nails\Queue\Constants::MODULE_SLUG)

// Queue alias registration (defaults provided for 'default' and 'priority')
Manager::addAlias(string $alias, Queue $queue): self
Manager::resolveQueue(string|Queue $alias): Queue

// Job lifecycle
Manager::push(Task $task, Data $data, Queue|string|null $queue = null, ?DateTimeInterface $availableAt = null): Job
Manager::getNextJob(array $queues, Resource\Worker $worker): ?Job
Manager::markJobAsComplete(Job $job): bool
Manager::markJobAsFailed(Job $job, Throwable $e): bool
Manager::retryJob(Job $job, Throwable $e): DateTime   // schedules next attempt

// Worker lifecycle & maintenance
Manager::registerWorker(array $queues): Resource\Worker
Manager::touchWorker(Resource\Worker $worker): Resource\Worker
Manager::unregisterWorker(Resource\Worker $worker): void
Manager::deleteStaleWorkers(): Resource\Worker[]
Manager::resetStuckJobs(): Job[]
Manager::rotateOldJobs(): Job[]

// Same liveness check as the admin dashboard alert
Manager::unworkedQueues(): Queue[]
Manager::isProcessed(Queue|string $queue): bool

namespace App\Queue\Queues;

use Nails\Queue\Interface\Queue;
use Nails\Queue\Resource\Worker;

class Reports implements Queue
{
    public static function setup(Worker $worker): void
    {
        // e.g. ensure storage directories exist
    }

    public static function refresh(Worker $worker): void
    {
        // e.g. rotate temp files, refresh API tokens, etc.
    }
}

$manager = \Nails\Factory::service('Manager', \Nails\Queue\Constants::MODULE_SLUG);
$manager->addAlias('reports', new \App\Queue\Queues\Reports());

namespace App\Queue\Tasks\Reports;

use Nails\Queue\Interface\Task;
use Nails\Queue\Interface\Data;

class Generate implements Task
{
    public static function getMaxRetries(): int
    {
        return 3;
    }

    public function run(Data $data): void
    {
        $payload = $data->get();
        // do the work using $payload
    }
}

use Nails\Factory;
use Nails\Queue\Constants;

$payload = (object) ['foo' => 'bar'];
$data    = Factory::factory('Data', onstants::MODULE_SLUG, $payload);

namespace App\Queue\Data\Reports;

use Nails\Queue\Factory\Data;

class ReportTable extends Data
{
    public static function make(string $name, array $header, array $rows)
    {
        $firstRow = reset($rows);
        if ($firstRow && count($header) !== count($rows)) {
            throw new \InvalidArgumentException(
                'Header and rows must be the same length'
            )
        } 
    
        return new self((object) [
            'name'   => $name,
            'header' => $header,
            'rows'   => $rows,
        ]);
    }
}

// ReportTable::make('My Table', ['Foo', 'Bar'], [['Fizz', 'Buzz']])

use App\Queue\Data;
use App\Queue\Tasks;
use Nails\Factory;
use Nails\Queue\Constants;
use Nails\Queue\Service\Manager;

/** @var Manager $queue */
$manager = Factory::service('Manager', Constants::MODULE_SLUG);

$rows   = [['Fizz', 'Buzz']];
$header = ['Foo', 'Bar'];

$job = $manager->push(
    // The task to execute
    task: new Tasks\Reports\Generate(),
    //  The data payload
    data: Data\Reports\ReportTable::make('My Table', $header, $rows),
    // alias, class name, instance, or null for default
    queue: new \App\Queue\Queues\Reports(),           
    // optional delay                       
    availableAt: (new DateTimeImmutable('+2 minutes'))
);