* @copyright 2007-2008 Digg.com, Inc.
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id$
* @link http://pear.php.net/package/Net_Gearman
* @link http://www.danga.com/gearman/
*/
require_once 'Net/Gearman/Task.php';
/**
* A class for creating sets of tasks
*
*
* array('1', '2'),
* 'Multiply' => array('3', '4')
* );
*
* $set = new Net_Gearman_Set();
* foreach ($jobs as $job => $args) {
* $task = new Net_Gearman_Task($job, $args);
* $task->attachCallback('echoResult');
* $set->addTask($task);
* }
*
* $client = new Net_Gearman_Client(array(
* '127.0.0.1:7003', '127.0.0.1:7004'
* ));
*
* $client->runSet($set);
*
* ?>
*
*
* @category Net
* @package Net_Gearman
* @author Joe Stump
* @copyright 2007-2008 Digg.com, Inc.
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @link http://www.danga.com/gearman/
* @see Net_Gearman_Job_Common, Net_Gearman_Worker
*/
class Net_Gearman_Set implements IteratorAggregate, Countable
{
/**
* Tasks count
*
* @var integer $tasksCount
*/
public $tasksCount = 0;
/**
* Tasks to run
*
* @var array $tasks
*/
public $tasks = array();
/**
* Handle to task mapping
*
* @var array $handles
*/
public $handles = array();
/**
* Callback registered for set
*
* @var mixed $callback
*/
protected $callback = null;
/**
* Constructor
*
* @param array $tasks Array of tasks to run
*
* @return void
* @see Net_Gearman_Task
*/
public function __construct(array $tasks = array())
{
foreach ($tasks as $task) {
$this->addTask($task);
}
}
/**
* Add a task to the set
*
* @param object $task Task to add to the set
*
* @return void
* @see Net_Gearman_Task, Net_Gearman_Set::$tasks
*/
public function addTask(Net_Gearman_Task $task)
{
if (!isset($this->tasks[$task->uniq])) {
$this->tasks[$task->uniq] = $task;
$this->tasksCount++;
}
}
/**
* Get a task
*
* @param string $handle Handle of task to get
*
* @return object Instance of task
* @throws Net_Gearman_Exception
*/
public function getTask($handle)
{
if (!isset($this->handles[$handle])) {
throw new Net_Gearman_Exception('Unknown handle');
}
if (!isset($this->tasks[$this->handles[$handle]])) {
throw new Net_Gearman_Exception('No task by that handle');
}
return $this->tasks[$this->handles[$handle]];
}
/**
* Is this set finished running?
*
* This function will return true if all of the tasks in the set have
* finished running. If they have we also run the set callbacks if there
* is one.
*
* @return boolean
*/
public function finished()
{
if ($this->tasksCount == 0) {
if (isset($this->callback)) {
foreach ($this->tasks as $task) {
$results[] = $task->result;
}
call_user_func($this->callback, $results);
}
return true;
}
return false;
}
/**
* Attach a callback to this set
*
* @param callback $callback A valid PHP callback
*
* @return void
* @throws Net_Gearman_Exception
*/
public function attachCallback($callback)
{
if (!is_callable($callback)) {
throw new Net_Gearman_Exception('Invalid callback specified');
}
$this->callback = $callback;
}
/**
* Get the iterator
*
* @return ArrayIterator Tasks
*/
public function getIterator()
{
return new ArrayIterator($this->tasks);
}
/**
* Get the task count
*
* @return int Number of tasks in the set
* @see {@link Countable::count()}
*/
public function count()
{
return $this->tasksCount;
}
}
?>