Пример #1
0
function queue_run($argv, $argc)
{
    cli_startup();
    global $a;
    require_once 'include/items.php';
    require_once 'include/bbcode.php';
    if (argc() > 1) {
        $queue_id = argv(1);
    } else {
        $queue_id = 0;
    }
    logger('queue: start');
    // delete all queue items more than 3 days old
    // but first mark these sites dead if we haven't heard from them in a month
    $r = q("select outq_posturl from outq where outq_created < %s - INTERVAL %s", db_utcnow(), db_quoteinterval('3 DAY'));
    if ($r) {
        foreach ($r as $rr) {
            $site_url = '';
            $h = parse_url($rr['outq_posturl']);
            $desturl = $h['scheme'] . '://' . $h['host'] . ($h['port'] ? ':' . $h['port'] : '');
            q("update site set site_dead = 1 where site_dead = 0 and site_url = '%s' and site_update < %s - INTERVAL %s", dbesc($desturl), db_utcnow(), db_quoteinterval('1 MONTH'));
        }
    }
    $r = q("DELETE FROM outq WHERE outq_created < %s - INTERVAL %s", db_utcnow(), db_quoteinterval('3 DAY'));
    if ($queue_id) {
        $r = q("SELECT * FROM outq WHERE outq_hash = '%s' LIMIT 1", dbesc($queue_id));
    } else {
        // For the first 12 hours we'll try to deliver every 15 minutes
        // After that, we'll only attempt delivery once per hour.
        // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl
        // so that we don't start off a thousand deliveries for a couple of dead hubs.
        // The zot driver will deliver everything destined for a single hub once contact is made (*if* contact is made).
        // Other drivers will have to do something different here and may need their own query.
        // Note: this requires some tweaking as new posts to long dead hubs once a day will keep them in the
        // "every 15 minutes" category. We probably need to prioritise them when inserted into the queue
        // or just prior to this query based on recent and long-term delivery history. If we have good reason to believe
        // the site is permanently down, there's no reason to attempt delivery at all, or at most not more than once
        // or twice a day.
        // FIXME: can we sort postgres on outq_priority and maintain the 'distinct' ?
        // The order by max(outq_priority) might be a dodgy query because of the group by.
        // The desired result is to return a sequence in the order most likely to be delivered in this run.
        // If a hub has already been sitting in the queue for a few days, they should be delivered last;
        // hence every failure should drop them further down the priority list.
        if (ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
            $prefix = 'DISTINCT ON (outq_posturl)';
            $suffix = 'ORDER BY outq_posturl';
        } else {
            $prefix = '';
            $suffix = 'GROUP BY outq_posturl ORDER BY max(outq_priority)';
        }
        $r = q("SELECT {$prefix} * FROM outq WHERE outq_delivered = 0 and (( outq_created > %s - INTERVAL %s and outq_updated < %s - INTERVAL %s ) OR ( outq_updated < %s - INTERVAL %s )) {$suffix}", db_utcnow(), db_quoteinterval('12 HOUR'), db_utcnow(), db_quoteinterval('15 MINUTE'), db_utcnow(), db_quoteinterval('1 HOUR'));
    }
    if (!$r) {
        return;
    }
    foreach ($r as $rr) {
        queue_deliver($rr);
    }
}
Пример #2
0
 public static function run($argc, $argv)
 {
     if ($argc < 2) {
         return;
     }
     logger('deliver: invoked: ' . print_r($argv, true), LOGGER_DATA);
     for ($x = 1; $x < $argc; $x++) {
         if (!$argv[$x]) {
             continue;
         }
         $dresult = null;
         $r = q("select * from outq where outq_hash = '%s' limit 1", dbesc($argv[$x]));
         if ($r) {
             $notify = json_decode($r[0]['outq_notify'], true);
             // Messages without an outq_msg will need to go via the web, even if it's a
             // local delivery. This includes conversation requests and refresh packets.
             if ($r[0]['outq_posturl'] === z_root() . '/post' && $r[0]['outq_msg']) {
                 logger('deliver: local delivery', LOGGER_DEBUG);
                 // local delivery
                 // we should probably batch these and save a few delivery processes
                 if ($r[0]['outq_msg']) {
                     $m = json_decode($r[0]['outq_msg'], true);
                     if (array_key_exists('message_list', $m)) {
                         foreach ($m['message_list'] as $mm) {
                             $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify, 'message' => $mm)))));
                             zot_import($msg, z_root());
                         }
                     } else {
                         $msg = array('body' => json_encode(array('success' => true, 'pickup' => array(array('notify' => $notify, 'message' => $m)))));
                         $dresult = zot_import($msg, z_root());
                     }
                     remove_queue_item($r[0]['outq_hash']);
                     if ($dresult && is_array($dresult)) {
                         foreach ($dresult as $xx) {
                             if (is_array($xx) && array_key_exists('message_id', $xx)) {
                                 if (delivery_report_is_storable($xx)) {
                                     q("insert into dreport ( dreport_mid, dreport_site, dreport_recip, dreport_result, dreport_time, dreport_xchan ) values ( '%s', '%s','%s','%s','%s','%s' ) ", dbesc($xx['message_id']), dbesc($xx['location']), dbesc($xx['recipient']), dbesc($xx['status']), dbesc(datetime_convert($xx['date'])), dbesc($xx['sender']));
                                 }
                             }
                         }
                     }
                     q("delete from dreport where dreport_queue = '%s'", dbesc($argv[$x]));
                 }
             }
             // otherwise it's a remote delivery - call queue_deliver() with the $immediate flag
             queue_deliver($r[0], true);
         }
     }
 }