All breakout queues that we're going to need to listen to now need to be explicitly listed in $config['queue']['breakout']. Until XMPP is moved to component model, this setting will let the individual processes work with their own queues: $config['queue']['breakout'][] = 'xmpp/xmppout/' . $config['site']['nickname'];
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env php
 | 
						|
<?php
 | 
						|
/*
 | 
						|
 * StatusNet - the distributed open-source microblogging tool
 | 
						|
 * Copyright (C) 2008, 2009, StatusNet, Inc.
 | 
						|
 *
 | 
						|
 * This program is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU Affero General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 3 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU Affero General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU Affero General Public License
 | 
						|
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
 | 
						|
 | 
						|
$shortoptions = 'fi:at:';
 | 
						|
$longoptions = array('id=', 'foreground', 'all', 'threads=');
 | 
						|
 | 
						|
/**
 | 
						|
 * Attempts to get a count of the processors available on the current system
 | 
						|
 * to fan out multiple threads.
 | 
						|
 *
 | 
						|
 * Recognizes Linux and Mac OS X; others will return default of 1.
 | 
						|
 *
 | 
						|
 * @fixme move this to SpawningDaemon, but to get the default val for help
 | 
						|
 *        text we seem to need it before loading infrastructure
 | 
						|
 * @return intval
 | 
						|
 */
 | 
						|
function getProcessorCount()
 | 
						|
{
 | 
						|
    $cpus = 0;
 | 
						|
    switch (PHP_OS) {
 | 
						|
    case 'Linux':
 | 
						|
        $cpuinfo = file('/proc/cpuinfo');
 | 
						|
        foreach (file('/proc/cpuinfo') as $line) {
 | 
						|
            if (preg_match('/^processor\s+:\s+(\d+)\s?$/', $line)) {
 | 
						|
                $cpus++;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case 'Darwin':
 | 
						|
        $cpus = intval(shell_exec("/usr/sbin/sysctl -n hw.ncpu 2>/dev/null"));
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    if ($cpus) {
 | 
						|
        return $cpus;
 | 
						|
    }
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
$threads = getProcessorCount();
 | 
						|
$helptext = <<<END_OF_QUEUE_HELP
 | 
						|
Daemon script for running queued items.
 | 
						|
 | 
						|
    -i --id           Identity (default none)
 | 
						|
    -f --foreground   Stay in the foreground (default background)
 | 
						|
    -a --all          Handle queues for all local sites
 | 
						|
                      (requires Stomp queue handler, status_network setup)
 | 
						|
    -t --threads=<n>  Spawn <n> processing threads (default $threads)
 | 
						|
 | 
						|
 | 
						|
END_OF_QUEUE_HELP;
 | 
						|
 | 
						|
require_once INSTALLDIR.'/scripts/commandline.inc';
 | 
						|
 | 
						|
require_once(INSTALLDIR.'/lib/daemon.php');
 | 
						|
require_once(INSTALLDIR.'/classes/Queue_item.php');
 | 
						|
require_once(INSTALLDIR.'/classes/Notice.php');
 | 
						|
 | 
						|
/**
 | 
						|
 * Queue handling daemon...
 | 
						|
 *
 | 
						|
 * The queue daemon by default launches in the background, at which point
 | 
						|
 * it'll pass control to the configured QueueManager class to poll for updates.
 | 
						|
 *
 | 
						|
 * We can then pass individual items through the QueueHandler subclasses
 | 
						|
 * they belong to.
 | 
						|
 */
 | 
						|
class QueueDaemon extends SpawningDaemon
 | 
						|
{
 | 
						|
    protected $allsites = false;
 | 
						|
 | 
						|
    function __construct($id=null, $daemonize=true, $threads=1, $allsites=false)
 | 
						|
    {
 | 
						|
        parent::__construct($id, $daemonize, $threads);
 | 
						|
        $this->allsites = $allsites;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Setup and start of run loop for this queue handler as a daemon.
 | 
						|
     * Most of the heavy lifting is passed on to the QueueManager's service()
 | 
						|
     * method, which passes control on to the QueueHandler's handle()
 | 
						|
     * method for each item that comes in on the queue.
 | 
						|
     *
 | 
						|
     * @return boolean true on success, false on failure
 | 
						|
     */
 | 
						|
    function runThread()
 | 
						|
    {
 | 
						|
        $this->log(LOG_INFO, 'checking for queued notices');
 | 
						|
 | 
						|
        $master = new QueueMaster($this->get_id());
 | 
						|
        $master->init($this->allsites);
 | 
						|
        try {
 | 
						|
            $master->service();
 | 
						|
        } catch (Exception $e) {
 | 
						|
            common_log(LOG_ERR, "Unhandled exception: " . $e->getMessage() . ' ' .
 | 
						|
                str_replace("\n", " ", $e->getTraceAsString()));
 | 
						|
            return self::EXIT_ERR;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->log(LOG_INFO, 'finished servicing the queue');
 | 
						|
 | 
						|
        $this->log(LOG_INFO, 'terminating normally');
 | 
						|
 | 
						|
        return $master->respawn ? self::EXIT_RESTART : self::EXIT_SHUTDOWN;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
class QueueMaster extends IoMaster
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Initialize IoManagers which are appropriate to this instance.
 | 
						|
     */
 | 
						|
    function initManagers()
 | 
						|
    {
 | 
						|
        $managers = array();
 | 
						|
        if (Event::handle('StartQueueDaemonIoManagers', array(&$managers))) {
 | 
						|
            $qm = QueueManager::get();
 | 
						|
            $qm->setActiveGroup('main');
 | 
						|
            $managers[] = $qm;
 | 
						|
        }
 | 
						|
        Event::handle('EndQueueDaemonIoManagers', array(&$managers));
 | 
						|
 | 
						|
        foreach ($managers as $manager) {
 | 
						|
            $this->instantiate($manager);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
if (have_option('i')) {
 | 
						|
    $id = get_option_value('i');
 | 
						|
} else if (have_option('--id')) {
 | 
						|
    $id = get_option_value('--id');
 | 
						|
} else if (count($args) > 0) {
 | 
						|
    $id = $args[0];
 | 
						|
} else {
 | 
						|
    $id = null;
 | 
						|
}
 | 
						|
 | 
						|
if (have_option('t')) {
 | 
						|
    $threads = intval(get_option_value('t'));
 | 
						|
} else if (have_option('--threads')) {
 | 
						|
    $threads = intval(get_option_value('--threads'));
 | 
						|
} else {
 | 
						|
    $threads = 0;
 | 
						|
}
 | 
						|
if (!$threads) {
 | 
						|
    $threads = getProcessorCount();
 | 
						|
}
 | 
						|
 | 
						|
$daemonize = !(have_option('f') || have_option('--foreground'));
 | 
						|
$all = have_option('a') || have_option('--all');
 | 
						|
 | 
						|
$daemon = new QueueDaemon($id, $daemonize, $threads, $all);
 | 
						|
$daemon->runOnce();
 | 
						|
 |