]> git.mxchange.org Git - friendica.git/blob - src/Worker/Queue.php
Queue.php is now moved as well
[friendica.git] / src / Worker / Queue.php
1 <?php
2 /**
3  * @file include/queue.php
4  */
5 use Friendica\Core\Cache;
6 use Friendica\Core\Config;
7 use Friendica\Core\Worker;
8 use Friendica\Database\DBM;
9 use Friendica\Protocol\Diaspora;
10 use Friendica\Protocol\DFRN;
11 use Friendica\Protocol\PortableContact;
12
13 require_once 'include/queue_fn.php';
14 require_once 'include/datetime.php';
15 require_once 'include/items.php';
16 require_once 'include/bbcode.php';
17 require_once 'include/salmon.php';
18
19 class Queue {
20         public static function execute($queue_id = 0)
21         {
22                 global $a;
23
24                 $cachekey_deadguy = 'queue_run:deadguy:';
25                 $cachekey_server = 'queue_run:server:';
26
27                 if (!$queue_id) {
28                         logger('queue: start');
29
30                         // Handling the pubsubhubbub requests
31                         Worker::add(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), 'pubsubpublish');
32
33                         $r = q(
34                                 "SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
35                                 INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
36                                 WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"
37                         );
38
39                         if (DBM::is_result($r)) {
40                                 foreach ($r as $rr) {
41                                         logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
42                                         logger('Expired queue data: ' . $rr['content'], LOGGER_DATA);
43                                 }
44                                 q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
45                         }
46
47                         /*
48                          * For the first 12 hours we'll try to deliver every 15 minutes
49                          * After that, we'll only attempt delivery once per hour.
50                          */
51                         $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
52
53                         call_hooks('queue_predeliver', $a, $r);
54
55                         if (DBM::is_result($r)) {
56                                 foreach ($r as $q_item) {
57                                         logger('Call queue for id '.$q_item['id']);
58                                         Worker::add(array('priority' => PRIORITY_LOW, 'dont_fork' => true), "Queue", (int)$q_item['id']);
59                                 }
60                         }
61                         return;
62                 }
63
64
65                 // delivering
66
67                 $r = q(
68                         "SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
69                         intval($queue_id)
70                 );
71
72                 if (!DBM::is_result($r)) {
73                         return;
74                 }
75
76                 $q_item = $r[0];
77
78                 $c = q(
79                         "SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
80                         intval($q_item['cid'])
81                 );
82
83                 if (!DBM::is_result($c)) {
84                         remove_queue_item($q_item['id']);
85                         return;
86                 }
87
88                 $dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
89
90                 if (!is_null($dead) && $dead) {
91                         logger('queue: skipping known dead url: '.$c[0]['notify']);
92                         update_queue_time($q_item['id']);
93                         return;
94                 }
95
96                 $server = PortableContact::detectServer($c[0]['url']);
97
98                 if ($server != "") {
99                         $vital = Cache::get($cachekey_server.$server);
100
101                         if (is_null($vital)) {
102                                 logger("Check server ".$server." (".$c[0]["network"].")");
103
104                                 $vital = PortableContact::checkServer($server, $c[0]["network"], true);
105                                 Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR);
106                         }
107
108                         if (!is_null($vital) && !$vital) {
109                                 logger('queue: skipping dead server: '.$server);
110                                 update_queue_time($q_item['id']);
111                                 return;
112                         }
113                 }
114
115                 $u = q(
116                         "SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
117                         FROM `user` WHERE `uid` = %d LIMIT 1",
118                         intval($c[0]['uid'])
119                 );
120                 if (!DBM::is_result($u)) {
121                         remove_queue_item($q_item['id']);
122                         return;
123                 }
124
125                 $data      = $q_item['content'];
126                 $public    = $q_item['batch'];
127                 $contact   = $c[0];
128                 $owner     = $u[0];
129
130                 $deliver_status = 0;
131
132                 switch ($contact['network']) {
133                         case NETWORK_DFRN:
134                                 logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
135                                 $deliver_status = DFRN::deliver($owner, $contact, $data);
136
137                                 if ($deliver_status == (-1)) {
138                                         update_queue_time($q_item['id']);
139                                         Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
140                                 } else {
141                                         remove_queue_item($q_item['id']);
142                                 }
143                                 break;
144                         case NETWORK_OSTATUS:
145                                 if ($contact['notify']) {
146                                         logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
147                                         $deliver_status = slapper($owner, $contact['notify'], $data);
148
149                                         if ($deliver_status == (-1)) {
150                                                 update_queue_time($q_item['id']);
151                                                 Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
152                                         } else {
153                                                 remove_queue_item($q_item['id']);
154                                         }
155                                 }
156                                 break;
157                         case NETWORK_DIASPORA:
158                                 if ($contact['notify']) {
159                                         logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
160                                         $deliver_status = Diaspora::transmit($owner, $contact, $data, $public, true);
161
162                                         if ($deliver_status == (-1)) {
163                                                 update_queue_time($q_item['id']);
164                                                 Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
165                                         } else {
166                                                 remove_queue_item($q_item['id']);
167                                         }
168                                 }
169                                 break;
170
171                         default:
172                                 $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
173                                 call_hooks('queue_deliver', $a, $params);
174
175                                 if ($params['result']) {
176                                         remove_queue_item($q_item['id']);
177                                 } else {
178                                         update_queue_time($q_item['id']);
179                                 }
180                                 break;
181                 }
182                 logger('Deliver status '.(int)$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
183
184                 return;
185         }
186 }