patieru/gearman

Gearman provider for queues in laravel 5.8 or laravel 6

v1.1.2 2019-10-25 08:47 UTC

This package is auto-updated.

Last update: 2024-04-25 19:26:04 UTC


README

This package gives you the possibily to add gearman as native queue back-end service

#Installation

first you need to add it to your composer.json

"patieru/gearman": "^1.1"

second, in config/app.php, you need to comment out the native queue service provider

//Illuminate\Queue\QueueServiceProvider::class,

and to put this instead:

Patieru\Gearman\GearmanServiceProvider::class,

Then in your config/queue.php file you can add:

'default' => 'gearman',
'connections' => [
    ................
    'gearman' => [
        'driver' => 'gearman',
        'host'   => 'localhost', //means you gearman server is installed on you local machine
        'queue'  => 'default',
        'port'   => 4730,
        'timeout' => 1000 //milliseconds
    ],
]

or, if you have multiple gearman servers:

'connections' => [
    ...........................
    'gearman' => [
        'driver' => 'gearman',
        'hosts'  => [
            ['host' => 'localserver.local', 'port' => 4730],
            ['host' => 'localserver2.local', 'port' => 4730],
        ],
        'queue'  => 'default',
        'timeout' => 1000 //milliseconds
    ]
]

Then Remember to change default connection for Queue change from

QUEUE_CONNECTION=sync

to

QUEUE_CONNECTION=gearman

in .env

Then in your code you can add code as (this is the native way to add jobs to the queue):

Job::dispatch();

Small hint, you can call Namespaced classes and everything that is written in the docs of laravel for calling custom methods is valid here, too.

Example:

I add a "service" folder to my app folder and inside I create a file "SendMail.php" The code of the class is here:

<?php

namespace App\Jobs;

use App\AudioProcessor;
use App\Podcast;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ProcessPodcast implements ShouldQueue {

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $podcast;

    public function __construct(Podcast $podcast){
        $this->podcast = $podcast;
    }

    public function handle(AudioProcessor $processor){
        // Process uploaded podcast...
    }

}

In you controller

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Jobs\ProcessPodcast;
use Illuminate\Http\Request;

class PodcastController extends Controller {
    /**
    * Store a new podcast.
    *
    * @param  Request  $request
    * @return Response
    */
    public function store(Request $request)
    {
        // Create podcast...

        ProcessPodcast::dispatch($podcast);
    }
}

In my routes file I add a new Route

Route::post('/gearman', 'App\Http\Controllers\PodcastController@store');

Finally I just run on my console:

php artisan queue:listen

And I go to check what's on my email

#Bugs

Please if you notice a bug open an issue or submit request.

Hope this package will help you