I’ve written an small wrapper for the gearman api. Normally I use Silex in the frontend. Today we’re going to build a service provider to allow us to integrate the gearman wrapper easily within our Silex applications.
Here I show you an example of how to use the service provider.
Imagine this simple worker:
use G\Gearman\Builder; $worker = Builder::createWorker(); $worker->on("worker.example", function ($response) { return strrev($response); }); $worker->run();
And this is the Silex application using the service provider as a gearman client:
use G\Gearman\Client; use G\GearmanServiceProvider; use Silex\Application; $app = new Application(); $app->register(new GearmanServiceProvider()); $app->get("/", function (Client $client) { return "Hello " . $client->doNormal("worker.example", "Gonzalo"); }); $app->run();
I’m using injector library to inject providers. I’ve written about it here.
This is the code of the service provider
namespace G; use G\Gearman\Client; use G\Gearman\Tasks; use Injector\InjectorServiceProvider; use Silex\Application; use Silex\ServiceProviderInterface; class GearmanServiceProvider implements ServiceProviderInterface { private $client; public function __construct(\GearmanClient $client = null) { if (is_null($client)) { $client = new \GearmanClient(); $client->addServers("localhost:4730"); } $this->client = $client; } public function register(Application $app) { $app->register(new InjectorServiceProvider([ 'G\Gearman\Client' => 'gearmanClient', 'G\Gearman\Tasks' => 'gearmanTasks', ])); $app['gearmanClient'] = function () use ($app) { $client = new Client($this->client); $client->onSuccess(function ($response) { return $response; }); return $client; }; $app['gearmanTasks'] = function () use ($app) { return new Tasks($this->client); }; } public function boot(Application $app) { } }
The code is available in my github account