Get expert guidance in a few days with a Laravel code review

Laravel Job Status

imtigger/laravel-job-status image

Laravel Job Status stats

Downloads
1M
Stars
393
Open Issues
16
Forks
57

View on GitHub →

Laravel Job Status

Laravel Job Status

Laravel package to add ability to track Job progress, status and result dispatched to Queue.

  • Queue name, attempts, status and created/updated/started/finished timestamp.

  • Progress update, with arbitrary current/max value and percentage auto calculated

  • Handles failed job with exception message

  • Custom input/output

  • Native Eloquent model JobStatus

  • Support all drivers included in Laravel (null/sync/database/beanstalkd/redis/sqs)

  • This package intentionally do not provide any UI for displaying Job progress.

    If you have such need, please refer to laravel-job-status-progress-view

    or make your own implementation using JobStatus model

Requirements

  • PHP >= 7.1
  • Laravel/Lumen >= 5.5

Installation

Installation for Laravel

Installation for Lumen

Usage

In your Job, use Trackable trait and call $this->prepareStatus() in constructor.

<?php
namespace App\Jobs;
 
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Imtigger\LaravelJobStatus\Trackable;
 
class TrackableJob implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels, Trackable;
 
public function __construct(array $params)
{
$this->prepareStatus();
$this->params = $params; // Optional
$this->setInput($this->params); // Optional
}
 
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$max = mt_rand(5, 30);
$this->setProgressMax($max);
 
for ($i = 0; $i <= $max; $i += 1) {
sleep(1); // Some Long Operations
$this->setProgressNow($i);
}
 
$this->setOutput(['total' => $max, 'other' => 'parameter']);
}
}

In your Job dispatcher, call $job->getJobStatusId() to get $jobStatusId:

<?php
 
class YourController {
use DispatchesJobs;
 
function go() {
$job = new TrackableJob([]);
$this->dispatch($job);
 
$jobStatusId = $job->getJobStatusId();
}
}

$jobStatusId can be used elsewhere to retrieve job status, progress and output.

<?php
$jobStatus = JobStatus::find($jobStatusId);

Troubleshooting

Call to undefined method ...->getJobStatusId()

Laravel provide many ways to dispatch Jobs. Not all methods return your Job object, for example:

<?php
YourJob::dispatch(); // Returns PendingDispatch instead of YourJob object, leaving no way to retrive `$job->getJobStatusId();`

If you really need to dispatch job in this way, workarounds needed: Create your own key

  1. Create migration adding extra key to job_statuses table.

  2. In your job, generate your own unique key and pass into prepareStatus();, $this->prepareStatus(['key' => $params['key']]);

  3. Find JobStatus another way: $jobStatus = JobStatus::whereKey($key)->firstOrFail();

Status not updating until transaction commited

On version >= 1.1, dedicated database connection support is added.

Therefore JobStatus updates can be saved instantly even within your application transaction.

Read setup step 6 for instructions.

Documentations

<?php
// Job protected methods (Call from your Job)
$this->prepareStatus(); // Must be called in constructor before any other methods
$this->setProgressMax(int $v); // Update the max number of progress
$this->setProgressNow(int $v); // Update the current number progress
$this->setProgressNow(int $v, int $every); // Update the current number progress, write to database only when $v % $every == 0
$this->incrementProgress(int $offset) // Increase current number progress by $offset
$this->incrementProgress(int $offset, int $every) // Increase current number progress by $offset, write to database only when $v % $every == 0
$this->setInput(array $v); // Store input into database
$this->setOutput(array $v); // Store output into database (Typically the run result)
 
// Job public methods (Call from your Job dispatcher)
$job->getJobStatusId(); // Return the primary key of JobStatus (To retrieve status later)
 
// JobStatus object fields
var_dump($jobStatus->job_id); // String (Result varies with driver, see note)
var_dump($jobStatus->type); // String
var_dump($jobStatus->queue); // String
var_dump($jobStatus->status); // String [queued|executing|finished|retrying|failed]
var_dump($jobStatus->attempts); // Integer
var_dump($jobStatus->progress_now); // Integer
var_dump($jobStatus->progress_max); // Integer
var_dump($jobStatus->input); // Array
var_dump($jobStatus->output); // Array, ['message' => $exception->getMessage()] if job failed
var_dump($jobStatus->created_at); // Carbon object
var_dump($jobStatus->updated_at); // Carbon object
var_dump($jobStatus->started_at); // Carbon object
var_dump($jobStatus->finished_at); // Carbon object
 
// JobStatus generated fields
var_dump($jobStatus->progress_percentage); // Double [0-100], useful for displaying progress bar
var_dump($jobStatus->is_ended); // Boolean, true if status == finished || status == failed
var_dump($jobStatus->is_executing); // Boolean, true if status == executing
var_dump($jobStatus->is_failed); // Boolean, true if status == failed
var_dump($jobStatus->is_finished); // Boolean, true if status == finished
var_dump($jobStatus->is_queued); // Boolean, true if status == queued
var_dump($jobStatus->is_retrying); // Boolean, true if status == retrying

Note

$jobStatus->job_id result varys with driver

Driver job_id
null NULL (Job not run at all!)
sync empty string
database integer
beanstalkd integer
redis string(32)
sqs GUID
Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.


Imtigger Laravel Job Status Related Articles

Track, Manage, and Monitor Queue Jobs with Vantage image

Track, Manage, and Monitor Queue Jobs with Vantage

Read article
The Hidden Cost of MySQL Defaults in Laravel Apps image

The Hidden Cost of MySQL Defaults in Laravel Apps

Read article
Record and Replay Requests With Laravel ChronoTrace image

Record and Replay Requests With Laravel ChronoTrace

Read article
Top 6 MySQL Database Management Struggles for Laravel Developers (And Smart Fixes) image

Top 6 MySQL Database Management Struggles for Laravel Developers (And Smart Fixes)

Read article
Track Job Progress and Status in Laravel with the Laravel Job Status Package image

Track Job Progress and Status in Laravel with the Laravel Job Status Package

Read article
Laravel performance monitoring in Honeybadger image

Laravel performance monitoring in Honeybadger

Read article
Cut PHP Code Review Time & Bugs into Half with CodeRabbit logo

Cut PHP Code Review Time & Bugs into Half with CodeRabbit

CodeRabbit is an AI-powered code review tool that specializes in PHP and Laravel, running PHPStan and offering automated PR analysis, security checks, and custom review features while remaining free for open-source projects.

Cut PHP Code Review Time & Bugs into Half with CodeRabbit
Lunar: Laravel E-Commerce logo

Lunar: Laravel E-Commerce

E-Commerce for Laravel. An open-source package that brings the power of modern headless e-commerce functionality to Laravel.

Lunar: Laravel E-Commerce
Lucky Media logo

Lucky Media

Get Lucky Now - the ideal choice for Laravel Development, with over a decade of experience!

Lucky Media
Bacancy logo

Bacancy

Supercharge your project with a seasoned Laravel developer with 4-6 years of experience for just $3200/month. Get 160 hours of dedicated expertise & a risk-free 15-day trial. Schedule a call now!

Bacancy
Tinkerwell logo

Tinkerwell

The must-have code runner for Laravel developers. Tinker with AI, autocompletion and instant feedback on local and production environments.

Tinkerwell
PhpStorm logo

PhpStorm

The go-to PHP IDE with extensive out-of-the-box support for Laravel and its ecosystem.

PhpStorm