Home

Awesome

Laravel EventCron Bundle

=======================

Laravel bundle to queue Events to a database and later fire them through artisan or a CronJob.

Introduction

I created this bundle to run events in a queue every x minutes through a CronJob (or manually).

It's an extension of the original Laravel Event, where you can queue events to table to be fired later.

Some examples

Example 1:

You want to schedule an e-mail to an user 24h after the registration.

	EventCron::queueDB('email24', array('user_id' => 1, 'message' => 'welcome'), date("Y-m-d H:i:s", strtotime("+24 hours")));

Example 2:

You have a time consumption action and you don't want to block the execution (Kind of non-blocking execution :).

Example 3:

You can also think about newsletter systems.

Note: this bundle does not attempt to be a replacement for Workers. You are not off loading processes to another machine. The processes are still executed in the same server has your own app.

Installation

php artisan bundle:install eventcron

Add it to application/bundles.php:

    return array(
        ...
        'eventcron' => array(
            'auto'  => true
        ),
        ...
    );

Now migrate to create the table:

php artisan migrate eventcron

Now play with it. For example:

	Route::get('addevent', function()
	{
		...
		// In Real time: 
		// Event::fire('log_something', array('FOOBAR', array('foo' => 'bar')));

		// With EventCron:
		EventCron::queueDB('log_something', array('FOOBAR', array('foo' => 'bar')));
		...
	});
	
	// The event
	Event::listen('log_something', function($str, $arr)
	{
		// Note: If you use a bundle inside please use Bundle::start('yourbundle');
		Log::info('str => ' . $str . ' arr => ' . print_r($arr, true));
	});

Setup the CronJob:

*/1 * * * * root php /var/www/laravel/artisan Eventcron::run log_something --env=local

Or just run the command:

php artisan Eventcron::run log_something --env=local

Note: If your CLI PHP doesn't have permissions to write to the log file just add "sudo php artisan ..."

Thats it, the cron will fire all the log_something events in the queue by FIFO order.

If you want there is a method to run all the queues in the table:

php artisan Eventcron::run:runall --env=local

You can also fire the events through a route (which I don't recommend). Just change the eventcron/config/config.php file to allow it:

'run_only_from_cli' => false,

And then:

	Route::get('fire', function()
	{
		EventCron::flushDB('log_something');
	});

Notice you can pass a date to the queue:

	 EventCron::queueDB('log_something', array('FOOBAR', array('foo' => 'bar')), date("Y-m-d H:i:s", strtotime("+2 hours")));

API

Add event to a queue:

	EventCron::queueDB($name = "string", $args = array() [, $date = date("Y-m-d H:i:s")]);

Flush events from a queue:

	EventCron::flushDB($name = "string");

Flush all the events:

	EventCron::flushAllDB();

Configurations

config.php (eventcron/config/config.php)

###enabled (default true)

Well, this one is easy. Right?

BOOLEAN true / false

###run_only_from_cli (default true)

Allow the CronJob to be run only from CLI (artisan).

BOOLEAN true / false

###max_events_per_execution (default 50)

Max number of events to fire in one run (set it to a lower number if you don't want the server go slower).

INTEGER number

###log_events (default true)

BOOLEAN true / false

##Questions? Problems?

Drop me a line at cossou@gmail.com or @cossou