root/dev/mods/ajcron/init.php @ 364

Revision 364, 7.3 KB (checked in by exi, 13 years ago)

First working version of ajcron, see  http://eve-id.net/forum/viewtopic.php?f=505&t=13513 for details

Line 
1<?php
2
3// make sure we are only running if xajax is enabled
4event::register('mod_xajax_initialised', 'ajcron::run');
5
6class ajcron
7{
8    function run()
9    {
10        global $xajax;
11        if (isset($xajax))
12        {
13            if (get_class($xajax) == 'xajax')
14            {
15                // we're good to go, set up our asynchronous callback
16                $xajax->registerFunction(array('ajcron', 'ajcron', 'xajax_req'));
17
18                // fastest way to check wether we have to run or not
19                if (config::get('ajcron_nextrun') < time())
20                {
21                    // we need to run
22                    mod_xajax::xajax();
23                    $xajax->configure('waitCursor', false);
24                    event::register('page_assembleheader', 'ajcron::insertHTML');
25                }
26            }
27        }
28    }
29
30    function insertHTML($page)
31    {
32        $page->addBody('<script type="text/javascript" charset="UTF-8">
33            var myLocalCallback = xajax.callback.create(4000, 10000);
34            myLocalCallback.onExpiration = function(req) { xajax.abortRequest(req); }
35            xajax.call(\'xajax_req\', {callback: myLocalCallback});</script>');
36    }
37
38    function getNextRunDisplay()
39    {
40        $nextrun = config::get('ajcron_nextrun');
41        if ($nextrun == 0)
42        {
43            return 'never';
44        }
45        else
46        {
47            return date('Y-m-d H:i:s', $nextrun);
48        }
49    }
50
51    function resetNextRunCheckbox()
52    {
53        if (config::get('ajcron_resetNextRun'))
54        {
55            config::set('ajcron_resetNextRun', 0);
56            config::set('ajcron_nextrun', time());
57        }
58        if (config::get('ajcron_resetRunning'))
59        {
60            config::set('ajcron_resetRunning', 0);
61            config::set('ajcron_running', array());
62        }
63    }
64
65    function getNextRun($intervall)
66    {
67        $time = time();
68
69        if (strstr($intervall, ':'))
70        {
71            $nextrun = strtotime($intervall);
72            if ($nextrun < $time)
73            {
74                $nextrun = strtotime('tomorrow '.$intervall);
75            }
76        }
77        elseif (strstr($intervall, '/'))
78        {
79            $int = substr($intervall, 1);
80            if ($int == 60)
81            {
82                $mintoh = 59-date('i', $time);
83                $stoh = 60-date('s', $time);
84                $nextrun = $time+$mintoh*60+$stoh;
85            }
86            else
87            {
88                $mintot = 59 % $int - date('i', $time);
89                $stot = 60 - date('s', $time);
90                while ($mintot < 0)
91                {
92                    $mintot += $int;
93                }
94                $nextrun = $time + $mintot * 60 + $stot;
95            }
96        }
97        return $nextrun;
98    }
99
100    function parseJobs()
101    {
102        $jobs = array();
103        $arr = explode("\n", config::get('ajcron_jobs'));
104        $i = 0;
105        foreach ($arr as $job)
106        {
107            if (!trim($job))
108            {
109                continue;
110            }
111            $tmp = preg_split("/".chr(32)."/", trim($job), -1, PREG_SPLIT_NO_EMPTY);
112            $nextrun = ajcron::getNextRun($tmp[0]);
113            $jobs[$i++] = array('id' => md5(trim($job)), 'nextrun' => $nextrun, 'name' => $tmp[2],  'url' => $tmp[1]);
114        }
115
116        return $jobs;
117    }
118
119    function getRuntable()
120    {
121        $output = '';
122        // load up our crontasks
123        $jobs = ajcron::parseJobs();
124        $state = config::get('ajcron_running');
125
126        foreach ($jobs as $job)
127        {
128            if (isset($state[$job['id']]))
129            {
130                $running = 'running';
131            }
132            else
133            {
134                $running = 'not running';
135            }
136
137            if (empty($job['name']))
138            {
139                $name = '-None found-';
140            }
141            else
142            {
143                $name = $job['name'];
144            }
145            $output .= '<b>Name:</b> '.$name.' <b>URL:</b> '.$job['url'].' <b>Nextrun:</b> '.date('Y-m-d H:i:s', $job['nextrun']).'<br/>';
146            $output .= '&nbsp;&nbsp;&nbsp;<b>State:</b> '.$running.' <b>ID: </b>'.$job['id'].'<br/><br/>';
147        }
148
149        return $output;
150    }
151
152    function getNextRuntime()
153    {
154        // calculate and set new runtime
155        $jobs = ajcron::parseJobs();
156        $sorttable = array();
157        // see which one should be started now
158        foreach ($jobs as $job)
159        {
160            $sorttable[$job['id']] = $job['nextrun'];
161        }
162        asort($sorttable);
163        config::set('ajcron_nextrun', $sorttable[key($sorttable)]);
164    }
165
166    function xajax_req()
167    {
168        // if the xajax call gets aborted, ignore that
169        @ignore_user_abort(true);
170        @set_time_limit(0);
171
172        $state = config::get('ajcron_running');
173        if (!is_array($state))
174        {
175            $state = array();
176            config::set('ajcron_running', $state);
177        }
178
179        // check for blocking
180        if (config::get('ajcron_blocking'))
181        {
182            // if there is already something running, give up
183            if (count($state) >= 1)
184            {
185                return;
186            }
187        }
188
189        // load up our crontasks
190        $jobs = ajcron::parseJobs();
191
192        // if there are no jobs just quit
193        if (!count($jobs))
194        {
195            return;
196        }
197
198        // see which one should be started now
199        $sorttable = array();
200        foreach ($jobs as $job)
201        {
202            $sorttable[$job['id']] = $job['nextrun'];
203        }
204        asort($sorttable);
205
206        foreach ($sorttable as $id => $nextrun)
207        {
208            // this bypasses already running jobs
209            if (isset($state[$id]))
210            {
211                continue;
212            }
213            break;
214        }
215
216        if (!$id)
217        {
218            // no id found we could run as all are running
219            return;
220        }
221
222        // set current id to running
223        $state[$id] = 'running';
224        $currentJob = null;
225        config::set('ajcron_running', $state);
226        foreach ($jobs as $job)
227        {
228            if ($job['id'] == $id)
229            {
230                $currentJob = $job;
231            }
232        }
233
234        // run the job (finally)
235        include_once('common/includes/class.http.php');
236        $http = new http_request($currentJob['url']);
237        $http->set_timeout(120);
238        $data = $http->get_content();
239
240        // job done, clean up
241        // we need to refresh our variable to prevent overwriting of
242        // other running jobs
243        $db = new DBQuery(true);
244        $db->execute('select * from kb3_config where cfg_site=\''.KB_SITE.'\' and cfg_key=\'ajcron_running\'');
245        $row = $db->getRow();
246        $state = unserialize($row['cfg_value']);
247        unset($state[$id]);
248        config::set('ajcron_running', $state);
249
250        // calculate when next to insert ajax
251        ajcron::getNextRuntime();
252
253        // testfun!
254        $objResponse = new xajaxResponse();
255        #$objResponse->Assign("header", "innerHTML", nl2br(var_export($sorttable[key($sorttable)], true)));
256        #sleep(15);
257        return $objResponse;
258    }
259}
Note: See TracBrowser for help on using the browser.