DataObjects/Core_watch.php
[Pman.Core] / Notify.php
1 <?php
2 require_once 'Pman.php';
3
4 /**
5  * notification script runner
6  *
7  * This does not actualy send stuf out, it only starts the NotifySend/{id}
8  * which does the actuall notifcations.
9  *
10  * It manages a pool of notifiers.
11  * 
12  * 
13  */
14
15
16 class Pman_Core_Notify extends Pman
17 {
18     
19     var $table = 'core_notify';
20     var $target = 'Core/NotifySend';
21     
22     function getAuth()
23     {
24         $ff = HTML_FlexyFramework::get();
25         if (!$ff->cli) {
26             die("access denied");
27         }
28         HTML_FlexyFramework::ensureSingle(__FILE__, $this);
29         return true;
30         
31     }
32     
33     var $pool = array();
34     
35     function get()    
36     {
37         DB_DataObject::debugLevel(1);
38         //date_default_timezone_set('UTC');
39        // phpinfo();exit;
40         
41         $w = DB_DataObject::factory($this->table);
42         $w->whereAdd('act_when > sent'); // eg.. sent is not valid..
43         $w->whereAdd('act_when < NOW()'); // eg.. not if future..
44
45         $w->orderBy('act_when ASC'); // oldest first.
46         $w->limit(1000); // we can run 1000 ...
47         $ar = $w->fetchAll('id');
48         
49         while (true) {
50             if (empty($ar)) {
51                 break;
52             }
53             if (!$this->poolfree()) {
54                 sleep(3);
55                 continue;
56             }
57             $p = array_shift($ar);
58             $this->run($p);
59         }
60         while(count($this->pool)) {
61             $this->poolfree();
62             sleep(3);
63         }
64         
65         die("DONE\n");
66     }
67     
68     function run($id)
69     {
70         $descriptorspec = array(
71             0 => array("file", "/dev/null", 'r'),  // stdin is a pipe that the child will read from
72             1 => array("file", "/dev/null", 'a'),  // stdout is a pipe that the child will write to
73             2 => array("file", "/dev/null", "a") // stderr is a file to write to
74          );
75         $php = $_SERVER["_"];
76         $cwd = getcwd(); // same as run on.. (so script should end up being same relatively..)
77         $app = $cwd . '/'. $_SERVER["SCRIPT_NAME"] . '  ' . $this->target . '/'. $id;
78         $cmd = $php . ' ' . $app;
79         echo $cmd . "\n";
80         $pipe = array();
81         $p = proc_open($cmd, $descriptorspec, $pipes, $cwd );
82         $this->pool[] = $p;
83     }
84     
85     function poolfree() {
86         $pool = array();
87         foreach($this->pool as $p) {
88             $ar = proc_get_Status($p);
89             //var_dump($ar);
90             if ($p['running']) {
91                 $pool[] = $p;
92             }
93         }
94         $this->pool = $pool;
95         if (count($pool) < 10) {
96             return true;
97         }
98         return false;
99         
100     }
101     
102     
103 }