Now make_upload_directory() is used, avoiding dependencies to
[moodle.git] / admin / cron.php
1 <?PHP // $Id$
3 /// This script looks through all the module directories for cron.php files
4 /// and runs them.  These files can contain cleanup functions, email functions
5 /// or anything that needs to be run on a regular basis.
6 ///
7 /// This file is best run from cron on the host system (ie outside PHP).
8 /// The script can either be invoked via the web server or via a standalone
9 /// version of PHP compiled for CGI.
10 ///
11 /// eg   wget -q -O /dev/null 'http://moodle.somewhere.edu/admin/cron.php'
12 /// or   php /web/moodle/admin/cron.php 
14     $FULLME = "cron";
16     $starttime = microtime();
17     
18 /// The current directory in PHP version 4.3.0 and above isn't necessarily the
19 /// directory of the script when run from the command line. The require_once()
20 /// would fail, so we'll have to chdir()
22     if (!isset($_SERVER['REMOTE_ADDR']) && isset($_SERVER['argv'][0])) {
23         chdir(dirname($_SERVER['argv'][0]));
24     }
26     require_once("../config.php");
28     if (!$alreadyadmin = isadmin()) {
29         unset($_SESSION['USER']);
30         unset($USER);
31         unset($_SESSION['SESSION']);
32         unset($SESSION);
33         $USER = get_admin();      /// Temporarily, to provide environment for this script
34     }
36     echo "<pre>\n";
38     $timenow  = time();
39     echo "Server Time: ".date('r',$timenow)."\n\n";
41 /// Run all cron jobs for each module
43     if ($mods = get_records_select("modules", "cron > 0 AND (($timenow - lastcron) > cron)")) {
44         foreach ($mods as $mod) {
45             $libfile = "$CFG->dirroot/mod/$mod->name/lib.php";
46             if (file_exists($libfile)) {
47                 include_once($libfile);
48                 $cron_function = $mod->name."_cron";
49                 if (function_exists($cron_function)) {
50                     if ($cron_function()) {
51                         if (! set_field("modules", "lastcron", $timenow, "id", $mod->id)) {
52                             echo "Error: could not update timestamp for $mod->fullname\n";
53                         }
54                     }
55                 }
56             }
57         }
58     }
60 /// Run all core cron jobs, but not every time since they aren't too important.
61 /// These don't have a timer to reduce load, so we'll use a random number 
62 /// to randomly choose the percentage of times we should run these jobs.
64     srand ((double) microtime() * 10000000);
65     $random100 = rand(0,100);
67     if ($random100 < 20) {     // Approximately 20% of the time.
68         echo "Running clean-up tasks...\n";
70         /// Unenrol users who haven't logged in for $CFG->longtimenosee
72         if ($CFG->longtimenosee) { // value in days
73             $longtime = $timenow - ($CFG->longtimenosee * 3600 * 24);
74             if ($students = get_users_longtimenosee($longtime)) {
75                 foreach ($students as $student) {
76                     if (unenrol_student($student->userid, $student->course)) {
77                         echo "Deleted student enrolment for user $student->userid from course $student->course\n";
78                     }
79                 }
80             }
81         }
82     
83     
84         /// Delete users who haven't confirmed within required period
86         $oneweek = $timenow - ($CFG->deleteunconfirmed * 3600);
87         if ($users = get_users_unconfirmed($oneweek)) {
88             foreach ($users as $user) {
89                 if (delete_records("user", "id", $user->id)) {
90                     echo "Deleted unconfirmed user for ".fullname($user, true)." ($user->id)\n";
91                 }
92             }
93         }
94     
95     
96         /// Delete duplicate enrolments (don't know what causes these yet - expired sessions?)
97     
98         if ($users = get_records_select("user_students", "userid > 0 GROUP BY course, userid ".
99                                         "HAVING count(*) > 1", "", "*,count(*)")) {
100             foreach ($users as $user) {
101                delete_records_select("user_students", "userid = '$user->userid' ".
102                                      "AND course = '$user->course' AND id <> '$user->id'");
103             }
104         }
105     
106     
107         /// Delete old logs to save space (this might need a timer to slow it down...)
108     
109         if (!empty($CFG->loglifetime)) {  // value in days
110             $loglifetime = $timenow - ($CFG->loglifetime * 3600 * 24);
111             delete_records_select("log", "time < '$loglifetime'");
112         }
114         /// Delete old cached texts
116         if (!empty($CFG->cachetext)) {   // Defined in config.php
117             $cachelifetime = time() - $CFG->cachetext;
118             delete_records_select("cache_text", "timemodified < '$cachelifetime'");
119         }
120     }
122     if (file_exists("$CFG->dataroot/cronextra.php")) {
123         include("$CFG->dataroot/cronextra.php");
124     }
126     if (!isset($CFG->disablescheduledbackups)) {   // Defined in config.php
127         //Execute backup's cron
128         //Perhaps a long time and memory could help in large sites
129         @set_time_limit(0);
130         ini_set("memory_limit","56M");
131         if (file_exists("$CFG->dirroot/backup/backup_scheduled.php") and
132             file_exists("$CFG->dirroot/backup/backuplib.php") and
133             file_exists("$CFG->dirroot/backup/lib.php") and
134             file_exists("$CFG->libdir/blocklib.php")) {
135             include_once("$CFG->dirroot/backup/backup_scheduled.php");
136             include_once("$CFG->dirroot/backup/backuplib.php");
137             include_once("$CFG->dirroot/backup/lib.php");
138             require_once ("$CFG->libdir/blocklib.php");
139             echo "Running backups if required...\n";
140             flush();
141     
142             if (! schedule_backup_cron()) {
143                 echo "Something went wrong while performing backup tasks!!!\n";
144             } else {
145                 echo "Backup tasks finished\n";
146             }
147         }
148     }
150     if (!empty($CFG->enablerssfeeds)) {  //Defined in admin/variables page
151         if (file_exists("$CFG->dirroot/rss/rsslib.php")) {
152             include_once("$CFG->dirroot/rss/rsslib.php");
153             echo "Running rssfeeds if required...\n";
154             flush();
156             if ( ! cron_rss_feeds()) {
157                 echo "Something went wrong while generating rssfeeds!!!\n";
158             } else {
159                 echo "Rssfeeds finished\n";
160             }
161         }
162     }
164     echo "Cron script completed correctly\n";
166     $difftime = microtime_diff($starttime, microtime());
167     echo "Execution took ".$difftime." seconds\n"; 
169 ?>