DataObjects/Core_image_type.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        // phpinfo();exit;
71         $tn = tempnam(ini_get('session.save_path'),'stdout') . '.stdout';
72         $descriptorspec = array(
73             0 => array("pipe", 'r'),  // stdin is a pipe that the child will read from
74             1 => array("file", $tn, 'w'),  // stdout is a pipe that the child will write to
75             2 => array("pipe", "w") // stderr is a file to write to
76          );
77         $php = $_SERVER["_"];
78         $sn =  $_SERVER["SCRIPT_NAME"];
79         
80         $cwd = $sn[0] == '/' ? dirname($sn) : dirname(realpath(getcwd() . $sn)); // same as run on.. (so script should end up being same relatively..)
81         $app = $cwd . '/' . basename($_SERVER["SCRIPT_NAME"]) . '  ' . $this->target . '/'. $id;
82         $cmd = $php . ' ' . $app. ' &';
83         //echo $cmd . "\n";
84         $pipe = array();
85         $p = proc_open($cmd, $descriptorspec, $pipes, $cwd );
86         $this->pool[] = array('proc' => $p, 'out' => $tn,  'cmd' => $cmd);
87     }
88     
89     function poolfree() {
90         $pool = array();
91         foreach($this->pool as $p) {
92             $ar = proc_get_status($p['proc']);
93            // print_r($p);
94             //print_r($ar);
95             if ($ar['running']) {
96                 $pool[] = $p;
97                 continue;
98             }
99             echo $p['cmd'] . " : " . file_get_contents($p['out']);
100             //unlink($p['out']);
101         }
102         $this->pool = $pool;
103         if (count($pool) < 10) {
104             return true;
105         }
106         return false;
107         
108     }
109     
110     
111 }