anonymous-php / yii-scheduling
Scheduling extension for Yii 1.1.* framework
Installs: 126
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 1
Open Issues: 0
Type:yii-extension
Requires
- php: >=7.0.0
- mtdowling/cron-expression: ~1.0
- symfony/process: 2.6.* || 3.* || 4.*
- yiisoft/mutex: 3.0.x-dev
- yiisoft/mutex-file: 3.0.x-dev
- yiisoft/yii: *
Requires (Dev)
- phpunit/phpunit: 7.*
Suggests
- guzzlehttp/guzzle: Required to use the thenPing method on schedules (~5.0).
This package is auto-updated.
Last update: 2024-12-08 02:25:56 UTC
README
This extension is the port of omnilight/yii2-scheduling (https://github.com/omnilight/yii2-scheduling)
Installation
The preferred way to install this extension is through composer.
Either run
php composer.phar require anonymous-php/yii-scheduling "*"
or add
"anonymous-php/yii-scheduling": "*"
to the require
section of your composer.json.
Description
This project is inspired by the Laravel's Schedule component and tries to bring it's simplicity to the Yii framework. Quote from Laravel's documentation:
In the past, developers have generated a Cron entry for each console command they wished to schedule.
However, this is a headache. Your console schedule is no longer in source control,
and you must SSH into your server to add the Cron entries. Let's make our lives easier.
After installation you have to create console command extending Anonymous\Scheduling\ScheduleCommand
class
and implement schedule()
method with your jobs inside:
<?php class ScheduleCommand extends \Anonymous\Scheduling\ScheduleCommand { protected function schedule(Schedule $schedule) { $schedule->command('foo')->monthly(); } }
When setup will be finished just put single line into crontab:
* * * * * php /path/to/yii yii schedule run 1>> /dev/null 2>&1
You can put your schedule into the schedule.php
file, or add it withing bootstrapping of your extension or
application
Schedule examples
This extension is support all features of Laravel's Schedule, except environments and maintance mode.
Scheduling Closures
$schedule->call(function() { // Do some task... })->hourly();
Scheduling Terminal Commands
$schedule->exec('composer self-update')->daily();
Running command of your application
$schedule->command('migrate')->cron('* * * * *');
Frequent Jobs
$schedule->command('foo')->everyFiveMinutes(); $schedule->command('foo')->everyTenMinutes(); $schedule->command('foo')->everyThirtyMinutes();
Daily Jobs
$schedule->command('foo')->daily();
Daily Jobs At A Specific Time (24 Hour Time)
$schedule->command('foo')->dailyAt('15:00');
Twice Daily Jobs
$schedule->command('foo')->twiceDaily();
Job That Runs Every Weekday
$schedule->command('foo')->weekdays();
Weekly Jobs
$schedule->command('foo')->weekly(); // Schedule weekly job for specific day (0-6) and time... $schedule->command('foo')->weeklyOn(1, '8:00');
Monthly Jobs
$schedule->command('foo')->monthly();
Job That Runs On Specific Days
$schedule->command('foo')->mondays(); $schedule->command('foo')->tuesdays(); $schedule->command('foo')->wednesdays(); $schedule->command('foo')->thursdays(); $schedule->command('foo')->fridays(); $schedule->command('foo')->saturdays(); $schedule->command('foo')->sundays();
Only Allow Job To Run When Callback Is True
$schedule->command('foo')->monthly()->when(function() { return true; });
E-mail The Output Of A Scheduled Job
$schedule->command('foo')->sendOutputTo($filePath)->processOutput(function ($textBody, $app) { if (trim($textBody) === '' ) { return; } $app->mailer ->compose() ->setTextBody($textBody) ->setSubject('Cronjob notification') ->setTo('admin@example.com') ->send(); });
Preventing Task Overlaps
$schedule->command('foo')->withoutOverlapping();
Used by default FileMutex
or 'mutex' application component (https://github.com/yiisoft/mutex)
Running Tasks On One Server
To utilize this feature, you must config mutex in the application component, except the FileMutex:
Yiisoft\Mutex\MysqlMutex
,Yiisoft\Mutex\PgsqlMutex
,Yiisoft\Mutex\OracleMutex
orYiisoft\Mutex\RedisMutex
. In addition, all servers must be communicating with the same central db/cache server.
Below shows the redis mutex demo:
'components' => [ 'mutex' => [ 'class' => 'Yiisoft\Mutex\RedisMutex', 'redis' => [ 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, ] ], ],
$schedule->command('report generate') ->fridays() ->at('17:00') ->onOneServer();
Using addition functions
If you want to use thenPing
method of the Event, you should add the following string to the composer.json
of your app:
"guzzlehttp/guzzle": "~5.0"
Note about timezones
Please note, that this is PHP extension, so it use timezone defined in php config or in your Yii's configuration file, so set them correctly.