diff options
Diffstat (limited to 'External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php')
| -rwxr-xr-x | External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php | 188 | 
1 files changed, 188 insertions, 0 deletions
| diff --git a/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php b/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php new file mode 100755 index 0000000..43bb1f4 --- /dev/null +++ b/External/swiftmailer/lib/classes/Swift/Plugins/ThrottlerPlugin.php @@ -0,0 +1,188 @@ +<?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/Events/SendEvent.php'; +//@require 'Swift/Plugins/BandwidthMonitorPlugin.php'; +//@require 'Swift/Plugins/Sleeper.php'; +//@require 'Swift/Plugins/Timer.php'; + +/** + * Throttles the rate at which emails are sent. + * @package Swift + * @subpackage Plugins + * @author Chris Corbyn + */ +class Swift_Plugins_ThrottlerPlugin +  extends Swift_Plugins_BandwidthMonitorPlugin +  implements Swift_Plugins_Sleeper, Swift_Plugins_Timer +{ +   +  /** Flag for throttling in bytes per minute */ +  const BYTES_PER_MINUTE = 0x01; +   +  /** Flag for throttling in emails per minute */ +  const MESSAGES_PER_MINUTE = 0x10; +   +  /** +   * The Sleeper instance for sleeping. +   * @var Swift_Plugins_Sleeper +   * @access private +   */ +  private $_sleeper; +   +  /** +   * The Timer instance which provides the timestamp. +   * @var Swift_Plugins_Timer +   * @access private +   */ +  private $_timer; +   +  /** +   * The time at which the first email was sent. +   * @var int +   * @access private +   */ +  private $_start; +   +  /** +   * The rate at which messages should be sent. +   * @var int +   * @access private +   */ +  private $_rate; +   +  /** +   * The mode for throttling. +   * This is {@link BYTES_PER_MINUTE} or {@link MESSAGES_PER_MINUTE} +   * @var int +   * @access private +   */ +  private $_mode; +   +  /** +   * An internal counter of the number of messages sent. +   * @var int +   * @access private +   */ +  private $_messages = 0; +   +  /** +   * Create a new ThrottlerPlugin. +   * @param int $rate +   * @param int $mode, defaults to {@link BYTES_PER_MINUTE} +   * @param Swift_Plugins_Sleeper $sleeper (only needed in testing) +   * @param Swift_Plugins_Timer $timer (only needed in testing) +   */ +  public function __construct($rate, $mode = self::BYTES_PER_MINUTE, +    Swift_Plugins_Sleeper $sleeper = null, Swift_Plugins_Timer $timer = null) +  { +    $this->_rate = $rate; +    $this->_mode = $mode; +    $this->_sleeper = $sleeper; +    $this->_timer = $timer; +  } +   +  /** +   * Invoked immediately before the Message is sent. +   * @param Swift_Events_SendEvent $evt +   */ +  public function beforeSendPerformed(Swift_Events_SendEvent $evt) +  { +    $time = $this->getTimestamp(); +    if (!isset($this->_start)) +    { +      $this->_start = $time; +    } +    $duration = $time - $this->_start; +     +    if (self::BYTES_PER_MINUTE == $this->_mode) +    { +      $sleep = $this->_throttleBytesPerMinute($duration); +    } +    else +    { +      $sleep = $this->_throttleMessagesPerMinute($duration); +    } +     +    if ($sleep > 0) +    { +      $this->sleep($sleep); +    } +  } +   +  /** +   * Invoked when a Message is sent. +   * @param Swift_Events_SendEvent $evt +   */ +  public function sendPerformed(Swift_Events_SendEvent $evt) +  { +    parent::sendPerformed($evt); +    ++$this->_messages; +  } +   +  /** +   * Sleep for $seconds. +   * @param int $seconds +   */ +  public function sleep($seconds) +  { +    if (isset($this->_sleeper)) +    { +      $this->_sleeper->sleep($seconds); +    } +    else +    { +      sleep($seconds); +    } +  } +   +  /** +   * Get the current UNIX timestamp +   * @return int +   */ +  public function getTimestamp() +  { +    if (isset($this->_timer)) +    { +      return $this->_timer->getTimestamp(); +    } +    else +    { +      return time(); +    } +  } +   +  // -- Private methods +   +  /** +   * Get a number of seconds to sleep for. +   * @param int $timePassed +   * @return int +   * @access private +   */ +  private function _throttleBytesPerMinute($timePassed) +  { +    $expectedDuration = $this->getBytesOut() / ($this->_rate / 60); +    return (int) ceil($expectedDuration - $timePassed); +  } +   +  /** +   * Get a number of seconds to sleep for. +   * @param int $timePassed +   * @return int +   * @access private +   */ +  private function _throttleMessagesPerMinute($timePassed) +  { +    $expectedDuration = $this->_messages / ($this->_rate / 60); +    return (int) ceil($expectedDuration - $timePassed); +  } +   +} | 
