PHP: running scheduled jobs (cron jobs)

67,506

Solution 1

That's what cronjobs are made for. man crontab assuming you are running a linux server. If you don't have shell access or no way to setup cronjobs, there are free services that setup cronjobs on external servers and ping one of your URLs.

Solution 2

If you have a cPanel host, you can add cron jobs through the web interface.Go to Advanced -> Cron Jobs and use the non-advanced form to set up the cron frequency. You want a command like this:

/usr/bin/php /path/to/your/php/script.php

Solution 3

Have you ever looked ATrigger? The PHP library is also available to start creating scheduled tasks without any overhead.

Disclaimer: I'm among their team.

Solution 4

if you're wondering how to actually run your PHP script from cron, there are two options: Call the PHP interpreter directly (i.e., "php /foo/myscript.php"), or use lynx (lynx http://mywebsite.com/myscript.php). Which one you choose depends mostly on how your script needs its environment configured - the paths and file access permissions will be different depending on whether you call it through the shell or the web browser. I'd recommend using lynx.

One side effect is that you get an e-mail every time it runs. To get around this, I make my cron PHP scripts output nothing (and it has to be nothing, not even whitespace) if they complete successfully, and an error message if they fail. I then call them using a small PHP script from cron. This way, I only get an e-mail if it fails. This is basically the same as the lynx method, except my shell script makes the HTTP request and not lynx.

Call this script "docron" or something (remember to chmod +x), and then use the command in your crontab: "docron http://mydomain.com/myscript.php". It e-mails you the output of the page as an HTML e-mail, if the page returns something.

#!/usr/bin/php
<?php

$h = @file_get_contents($_SERVER['argv'][1]);

if ($h === false)
{
        $h = "<b>Failed to open file</b>: " . $_SERVER['argv'][1];
}

if ($h != '')
{
        @mail("[email protected]", $_SERVER['argv']['1'], $h, "From: [email protected]\nMIME-Version: 1.0\nContent-type: text/html; charset=iso-8859-1");
}

?>

Solution 5

If you want to avoid setting up cron jobs and whatnot (though I'd suggest it's a better method), the solution you've provided is pretty good. On a number of projects, I've had the PHP script itself do the check to see whether it's time to run the update.

The down-side (okay, one of the down sides) is that if no one is using the app during a certain period then the script won't run.

The up-side is that if no one is using the app during a certain period then the script won't run. The tasks I've got it set up to do are things like "update a cache file", "do a daily backup" and whatnot. If someone isn't using the app, then you aren't going to need updated cache files, nor are there going to be any database changes to backup.

The only modification to your method which I'd suggest is that you only run those checks when someone successfully logs in. You don't need to check on every page load.

Share:
67,506
user1521401
Author by

user1521401

Mostly interested in web based programming languages.

Updated on February 28, 2020

Comments

  • user1521401
    user1521401 about 4 years

    I have a site on my webhotel I would like to run some scheduled tasks on. What methods of achieving this would you recommend?

    What I’ve thought out so far is having a script included in the top of every page and then let this script check whether it’s time to run this job or not.

    This is just a quick example of what I was thinking about:

    if ($alreadyDone == 0 && time() > $timeToRunMaintainance) {
       runTask();
       $timeToRunMaintainance = time() + $interval;
    } 
    

    Anything else I should take into consideration or is there a better method than this?

  • user1521401
    user1521401 over 15 years
    Do you know about anyone you could recommend?
  • ConroyP
    ConroyP over 15 years
    siteuptime.com can be set to ping pages on your site at regular intervals - ostensibly checking for uptime, but could trigger your jobs if they're in an accessible script. Best way is to set up your own crontab/scheduled task though, so unexpected user accesses can't re-run your jobs
  • Laith
    Laith over 15 years
    I agree completely with the intent here. Another good option if you can't call the interpreter directly is wget.
  • Artem Shmatkov
    Artem Shmatkov about 15 years
    Great i was looking for this i think for perl i should use /usr/bin/perl :p
  • Frank Farmer
    Frank Farmer about 12 years
    for high frequency tasks where overlapping is an issue, how would you use monit?
  • mixdev
    mixdev almost 12 years
    Since there are PID file locking, you can configure it to run just one instance of the file. But yeah, with tools like Solo, similar functionality can be achieved with Cron timkay.com/solo
  • Damiqib
    Damiqib almost 12 years
    Question was posted nearly 4 years ago, so it's safe to assume, that this is not a problem anymore. :)
  • meeeeeh
    meeeeeh almost 12 years
    i found this Question through google. other people google too.
  • user1521401
    user1521401 almost 12 years
    @Damiqib, I don't think the question will ever be too old. There will come newer and better ways of solving a problem. So I welcome this answer even if it is to an old question.
  • Sam
    Sam about 6 years
    You might want to update that link since it's sending users to http protocol instead of the https