Giter Site home page Giter Site logo

silverstripe-crontask's Introduction

Scrutinizer Code Quality Scrutinizer Code Coverage Travis Build Status

SilverStripe CronTask

Gives developers an ability to configure cron-like tasks through the code.

This module intentionally doesn't surface any of the configuration or logs to the CMS, being of an opinion these tasks belong with developers and sysadmins. If you want that, see the "CMS-driven scheduler" section below.

What problem does module solve?

Developers don't always have access to the server to configure cronjobs, and instead they have to rely on server administrators to do it for them. This can slow down development cycles, and can lead to misunderstandings and misconfigurations if cronjobs are set up by hand.

This module solves this by getting the sysadmin to set up a single generic cronjob on the server side, and delegate the actual job definition to the PHP code.

CMS-driven scheduler

If you are looking for CMS-controllable scheduler, please check out the queuedjobs module. Here are some examples of how to implement recurring jobs with that module:

Installing

Add the following to your project's composer.json:

{
	"require": {
		"silverstripe/crontask": "*"
	}
}

Run composer update (this will also install needed 3rd party libs in ./vendor)

Usage

Implement the CronTask interface on a new or already existing class:

class TestCron implements CronTask {

	/**
	 * run this task every 5 minutes
	 *
	 * @return string
	 */
	public function getSchedule() {
		return "*/5 * * * *";
	}

	/**
	 *
	 * @return void
	 */
	public function process() {
		echo 'hello';
	}
}

Run ./framework/sake dev/build flush=1 to make SilverStripe aware of the new module.

Then execute the crontask controller, it's preferable you do this via the CLI since that is how the server will execute it.

./framework/sake dev/cron

Server configuration

Linux and Unix servers often comes installed with a cron daemon that are running commands according to a schedule. How to configure these can vary a lot but the most common way is by adding a file to the /etc/cron.d/ directory.

First find the correct command to execute, for example:

/usr/bin/php /path/to/silverstripe/docroot/framework/cli-script.php dev/cron

Then find out which user the webserver is running on, for example www-data.

Then create / edit the cron definition:

sudo vim /etc/cron.d/silverstripe-crontask

The content of that file should be:

* * * * * www-data /usr/bin/php /path/to/silverstripe/docroot/framework/cli-script.php dev/cron

This will run every minute as the www-data user and check if there are any outstanding tasks that needs to be executed.

By default this will output information on which cron tasks are being executed -
if you are monitoring cron output for errors you can suppress this output by adding quiet=1 - for example

[email protected]
* * * * * www-data /usr/bin/php /path/to/silverstripe/docroot/framework/cli-script.php dev/cron quiet=1

Warning: Observe that the crontask module doesn't do any checking. If you define a task to run every 5 mins it will run every 5 minutes whether it completed or not (as a normal cron would). If the run time of an 'every-5-minutes' task started at 17:10 is more than five minutes, it starts another process at 17:15 which may interfere with the still running process. You can either make the task run less often or use something like queuedjobs, which allows a job to re-schedule itself at a certain period after finishing (see 'CMS-driven scheduler' above).

For more information on how to debug and troubleshoot cronjobs, see http://serverfault.com/a/449652.

The getSchedule() method

The crontask controller expects that the getSchedule returns a string as a cron expression.

Some examples:

  • * * * * * - every time
  • */5 * * * * - every five minute (00:05, 00:10, 00:15 etc)
  • 0 1 * * * - every day at 01:00
  • 0 0 2 * * - the 2nd of every month at 00:00
  • 0 0 0 ? 1/2 FRI#2 * - Every second Friday of every other month at 00:00

Example:

public function getSchedule() {
    return "0 1 * * *";
}

The process() method

The process method will be executed only when it's time for a task to run (according to the getSchedule method). What you do in here is up to you. You can either do work in here or for example execute BuildTasks run() methods.

public function process() {
    $task = FilesystemSyncTask::create();
    $task->run(null);
}

CRON Expressions

A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows:

*    *    *    *    *    *
-    -    -    -    -    -
|    |    |    |    |    |
|    |    |    |    |    + year [optional]
|    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7)
|    |    |    +---------- month (1 - 12)
|    |    +--------------- day of month (1 - 31)
|    +-------------------- hour (0 - 23)
+------------------------- min (0 - 59)

For more information about what cron expression is allowed, see the Cron-Expression post from the creator of the 3rd party library.

Contribute

Do you want to contribute? Great, please see the CONTRIBUTING.md guide.

License

This module is released under the BSD 3-Clause License, see LICENSE.

Code of conduct

When having discussions about this module in issues or pull request please adhere to the SilverStripe Community Code of Conduct.

Thanks

Thanks to Michael Dowling for doing the actual job of parsing cron expressions.

This module is just a thin wrapper around his code.

silverstripe-crontask's People

Contributors

dhensby avatar mateusz avatar micschk avatar robbieaverill avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.