A Laravel 4 package that enables you to queue events and fire them in sequence, or at a specific time in the future.
- Sending a user an e-mail 24 hours after registration
- Scheduled mailing and newsletters
- Time consuming processes that would run better at night
- Firing events in a continuous matter (just queue a new event once it's fired)
Add the package to your composer.json and run composer update
.
{
"require": {
"cossou/eventcron": "*"
}
}
Add the service provider in app/config/app.php
:
'providers' => [
…
'Cossou\EventCRON\EventCRONServiceProvider'
]
Optionally add the facade to your aliases:
'aliases' => [
…
'EventCRON' => 'Cossou\EventCRON\Facades\EventCRON'
]
If you are using Laravel 4.0 ,perform the migration to create the database tables:
php artisan migrate --package=cossou/eventcron
Or if you are using Laravel 4.1, publish the package migration to your application
php artisan migrate:publish cossou/eventcron
php artisan migrate
To get started, there are three ways in which you can utilize this package.
Via the facade, if you added it to your configuration file (preferred way):
EventCRON::queue('myevent');
By using the Laravel IoC container:
App::make('eventcron')->queue('myevent');
Directly through the class:
$eventcron = new Cossou\EventCRON\EventCRONManager();
$eventcron->queue('myevent');
As shown, you can just queue your event and listen to it elsewhere.
EventCRON::queue('myevent');
Event::listen('myevent', function()
{
echo 'myevent just got fired!';
});
Flushing the queue for this event will fire all of them at once, since no time has been set.
You can also pass some data to your event handler in the form of an array.
EventCRON::queue('myevent', ['string', $variable, 12, new Object()]);
Laravel will then extract all of these variables and pass them to your event handler:
Event::listen('myevent', function($string, $variable, $number, $object)
{
echo 'myevent just got fired with some neat arguments';
dd($string, variable, $number, $object);
});
Of course, the main idea of this package is to schedule your events. Just pass a Carbon instance as third parameter:
EventCRON::queue('myevent', NULL, Carbon\Carbon::now()->addHour());
This event will only be triggered one hour from now.
Carbon is a nice extension to PHP's datetime class(es). For more info: https://github.com/briannesbitt/Carbon.
Now that you've added all these events, you'd want them to be triggered so your whole setup actually does something.
To trigger the queue for a single event:
EventCRON::flush('myevent');
To trigger the queue of all events:
EventCRON::flushAll();
Please note: events with an execution time set will only be triggered if that moment is in the past. In addition, if the configuration file states enabled
as false
or run_only_from_cli
as true
(and you're flushing a queue from code), nothing will happen.
The following commands are used to flush queues from the CLI:
php artisan eventcron:trigger myevent
php artisan eventcron:trigger:all
On most occasions though, you'd trigger events in your queue with a CRON job instead of directly from code or the CLI.
Use crontab -e
or sudo crontab -e
to get into your CRON file and add the following line at the end to flush all queues every minute (because you never know when you've scheduled an event):
*/1 * * * * php /var/www/myproject/artisan eventcron:trigger:all
Publish the package's configuration file with:
php artisan config:publish cossou/eventcron
Simply enable or disable the package.
BOOLEAN true / false
Allow the flushing of queues only from your command line interface (CLI).
BOOLEAN true / false
Maximum 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
Whether or not to write debug messages your log.
BOOLEAN true / false