Вход Регистрация
Файл: protected/extensions/yii-mail/vendors/swiftMailer/classes/Swift/Transport/LoadBalancedTransport.php
Строк: 173
<?php

/*
 * This file is part of SwiftMailer.
 * (c) 2004-2009 Chris Corbyn
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

//@require 'Swift/Transport.php';
//@require 'Swift/Mime/Message.php';
//@require 'Swift/Events/EventListener.php';

/**
 * Redudantly and rotationally uses several Transports when sending.
 * 
 * @package Swift
 * @subpackage Transport
 * @author Chris Corbyn
 */
class Swift_Transport_LoadBalancedTransport implements Swift_Transport
{
  
  
/** Transports which are deemed useless */
  
private $_deadTransports = array();
  
  
/**
   * The Transports which are used in rotation.
   * 
   * @var array Swift_Transport
   * @access protected
   */
  
protected $_transports = array();
  
  
/**
   * Creates a new LoadBalancedTransport.
   */
  
public function __construct()
  {
  }
  
  
/**
   * Set $transports to delegate to.
   * 
   * @param array $transports Swift_Transport
   */
  
public function setTransports(array $transports)
  {
    
$this->_transports $transports;
    
$this->_deadTransports = array();
  }
  
  
/**
   * Get $transports to delegate to.
   * 
   * @return array Swift_Transport
   */
  
public function getTransports(array $transports)
  {
    return 
array_merge($this->_transports$this->_deadTransports);
  }
  
  
/**
   * Test if this Transport mechanism has started.
   * 
   * @return boolean
   */
  
public function isStarted()
  {
    return 
count($this->_transports) > 0;
  }
  
  
/**
   * Start this Transport mechanism.
   */
  
public function start()
  {
    
$this->_transports array_merge($this->_transports$this->_deadTransports);
  }
  
  
/**
   * Stop this Transport mechanism.
   */
  
public function stop()
  {
    foreach (
$this->_transports as $transport)
    {
      
$transport->stop();
    }
  }
  
  
/**
   * Send the given Message.
   * 
   * Recipient/sender data will be retreived from the Message API.
   * The return value is the number of recipients who were accepted for delivery.
   * 
   * @param Swift_Mime_Message $message
   * @param string[] &$failedRecipients to collect failures by-reference
   * @return int
   */
  
public function send(Swift_Mime_Message $message, &$failedRecipients null)
  {
    
$maxTransports count($this->_transports);
    
$sent 0;
    
    for (
$i 0$i $maxTransports
      
&& $transport $this->_getNextTransport(); ++$i)
    {
      try
      {
        if (!
$transport->isStarted())
        {
          
$transport->start();
        }
        if (
$sent $transport->send($message$failedRecipients))
        {
          break;
        }
      }
      catch (
Swift_TransportException $e)
      {
        
$this->_killCurrentTransport();
      }
    }
    
    if (
count($this->_transports) == 0)
    {
      throw new 
Swift_TransportException(
        
'All Transports in LoadBalancedTransport failed, or no Transports available'
        
);
    }
    
    return 
$sent;
  }
  
  
/**
   * Register a plugin.
   * 
   * @param Swift_Events_EventListener $plugin
   */
  
public function registerPlugin(Swift_Events_EventListener $plugin)
  {
    foreach (
$this->_transports as $transport)
    {
      
$transport->registerPlugin($plugin);
    }
  }
  
  
// -- Protected methods
  
  /**
   * Rotates the transport list around and returns the first instance.
   * 
   * @return Swift_Transport
   * @access protected
   */
  
protected function _getNextTransport()
  {
    if (
$next array_shift($this->_transports))
    {
      
$this->_transports[] = $next;
    }
    return 
$next;
  }
  
  
/**
   * Tag the currently used (top of stack) transport as dead/useless.
   * 
   * @access protected
   */
  
protected function _killCurrentTransport()
  {
    if (
$transport array_pop($this->_transports))
    {
      try
      {
        
$transport->stop();
      }
      catch (
Exception $e)
      {
      }
      
$this->_deadTransports[] = $transport;
    }
  }
  
}
Онлайн: 2
Реклама