]> git.mxchange.org Git - friendica.git/blob - include/queue.php
Merge remote-tracking branch 'upstream/develop' into 1601-dfrn
[friendica.git] / include / queue.php
1 <?php
2 require_once("boot.php");
3 require_once('include/queue_fn.php');
4
5 function queue_run(&$argv, &$argc){
6         global $a, $db;
7
8         if(is_null($a)){
9                 $a = new App;
10         }
11
12         if(is_null($db)){
13                 @include(".htconfig.php");
14                 require_once("include/dba.php");
15                 $db = new dba($db_host, $db_user, $db_pass, $db_data);
16                 unset($db_host, $db_user, $db_pass, $db_data);
17         };
18
19
20         require_once("include/session.php");
21         require_once("include/datetime.php");
22         require_once('include/items.php');
23         require_once('include/bbcode.php');
24         require_once('include/pidfile.php');
25         require_once('include/socgraph.php');
26
27         load_config('config');
28         load_config('system');
29
30         $lockpath = get_lockpath();
31         if ($lockpath != '') {
32                 $pidfile = new pidfile($lockpath, 'queue');
33                 if($pidfile->is_already_running()) {
34                         logger("queue: Already running");
35                         if ($pidfile->running_time() > 9*60) {
36                                 $pidfile->kill();
37                                 logger("queue: killed stale process");
38                                 // Calling a new instance
39                                 proc_run('php',"include/queue.php");
40                         }
41                         return;
42                 }
43         }
44
45         $a->set_baseurl(get_config('system','url'));
46
47         load_hooks();
48
49         if($argc > 1)
50                 $queue_id = intval($argv[1]);
51         else
52                 $queue_id = 0;
53
54         $deadguys = array();
55         $deadservers = array();
56         $serverlist = array();
57
58         logger('queue: start');
59
60         // Handling the pubsubhubbub requests
61         proc_run('php','include/pubsubpublish.php');
62
63         $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
64
65         // If we are using the worker we don't need a delivery interval
66         if (get_config("system", "worker"))
67                 $interval = false;
68
69         $r = q("select * from deliverq where 1");
70         if($r) {
71                 foreach($r as $rr) {
72                         logger('queue: deliverq');
73                         proc_run('php','include/delivery.php',$rr['cmd'],$rr['item'],$rr['contact']);
74                         if($interval)
75                                 @time_sleep_until(microtime(true) + (float) $interval);
76                 }
77         }
78
79         $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
80                 INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
81                 WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
82         if($r) {
83                 foreach($r as $rr) {
84                         logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
85                         logger('Expired queue data :' . $rr['content'], LOGGER_DATA);
86                 }
87                 q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
88         }
89
90         if($queue_id) {
91                 $r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1",
92                         intval($queue_id)
93                 );
94         }
95         else {
96
97                 // For the first 12 hours we'll try to deliver every 15 minutes
98                 // After that, we'll only attempt delivery once per hour.
99
100                 $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
101         }
102         if(! $r){
103                 return;
104         }
105
106         if(! $queue_id)
107                 call_hooks('queue_predeliver', $a, $r);
108
109
110         // delivery loop
111
112         require_once('include/salmon.php');
113         require_once('include/diaspora.php');
114
115         foreach($r as $q_item) {
116
117                 // queue_predeliver hooks may have changed the queue db details,
118                 // so check again if this entry still needs processing
119
120                 if($queue_id) {
121                         $qi = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
122                                 intval($queue_id)
123                         );
124                 }
125                 else {
126                         $qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
127                                 intval($q_item['id'])
128                         );
129                 }
130                 if(! count($qi))
131                         continue;
132
133
134                 $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
135                         intval($qi[0]['cid'])
136                 );
137                 if(! count($c)) {
138                         remove_queue_item($q_item['id']);
139                         continue;
140                 }
141                 if(in_array($c[0]['notify'],$deadguys)) {
142                         logger('queue: skipping known dead url: ' . $c[0]['notify']);
143                         update_queue_time($q_item['id']);
144                         continue;
145                 }
146
147                 $server = poco_detect_server($c[0]['url']);
148
149                 if (($server != "") AND !in_array($server, $serverlist)) {
150                         logger("Check server ".$server." (".$c[0]["network"].")");
151                         if (!poco_check_server($server, $c[0]["network"], true))
152                                 $deadservers[] = $server;
153
154                         $serverlist[] = $server;
155                 }
156
157                 if (($server != "") AND in_array($server, $deadservers)) {
158                         logger('queue: skipping known dead server: '.$server);
159                         update_queue_time($q_item['id']);
160                         continue;
161                 }
162
163                 $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
164                         FROM `user` WHERE `uid` = %d LIMIT 1",
165                         intval($c[0]['uid'])
166                 );
167                 if(! count($u)) {
168                         remove_queue_item($q_item['id']);
169                         continue;
170                 }
171
172                 $data      = $qi[0]['content'];
173                 $public    = $qi[0]['batch'];
174                 $contact   = $c[0];
175                 $owner     = $u[0];
176
177                 $deliver_status = 0;
178
179                 switch($contact['network']) {
180                         case NETWORK_DFRN:
181                                 logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
182                                 $deliver_status = dfrn_deliver($owner,$contact,$data);
183
184                                 if($deliver_status == (-1)) {
185                                         update_queue_time($q_item['id']);
186                                         $deadguys[] = $contact['notify'];
187                                 } else
188                                         remove_queue_item($q_item['id']);
189
190                                 break;
191                         case NETWORK_OSTATUS:
192                                 if($contact['notify']) {
193                                         logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
194                                         $deliver_status = slapper($owner,$contact['notify'],$data);
195
196                                         if($deliver_status == (-1)) {
197                                                 update_queue_time($q_item['id']);
198                                                 $deadguys[] = $contact['notify'];
199                                         } else
200                                                 remove_queue_item($q_item['id']);
201                                 }
202                                 break;
203                         case NETWORK_DIASPORA:
204                                 if($contact['notify']) {
205                                         logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
206                                         $deliver_status = diaspora_transmit($owner,$contact,$data,$public,true);
207
208                                         if($deliver_status == (-1)) {
209                                                 update_queue_time($q_item['id']);
210                                                 $deadguys[] = $contact['notify'];
211                                         } else
212                                                 remove_queue_item($q_item['id']);
213
214                                 }
215                                 break;
216
217                         default:
218                                 $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
219                                 call_hooks('queue_deliver', $a, $params);
220
221                                 if($params['result'])
222                                         remove_queue_item($q_item['id']);
223                                 else
224                                         update_queue_time($q_item['id']);
225
226                                 break;
227
228                 }
229                 logger('Deliver status '.$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
230         }
231
232         return;
233
234 }
235
236 if (array_search(__file__,get_included_files())===0){
237   queue_run($_SERVER["argv"],$_SERVER["argc"]);
238   killme();
239 }