Overview

Namespaces

  • bandwidthThrottle
    • tokenBucket
      • storage
        • scope

Classes

  • bandwidthThrottle\tokenBucket\BlockingConsumer
  • bandwidthThrottle\tokenBucket\Rate
  • bandwidthThrottle\tokenBucket\storage\FileStorage
  • bandwidthThrottle\tokenBucket\storage\IPCStorage
  • bandwidthThrottle\tokenBucket\storage\MemcachedStorage
  • bandwidthThrottle\tokenBucket\storage\MemcacheStorage
  • bandwidthThrottle\tokenBucket\storage\PDOStorage
  • bandwidthThrottle\tokenBucket\storage\PHPRedisStorage
  • bandwidthThrottle\tokenBucket\storage\PredisStorage
  • bandwidthThrottle\tokenBucket\storage\SessionStorage
  • bandwidthThrottle\tokenBucket\storage\SingleProcessStorage
  • bandwidthThrottle\tokenBucket\TokenBucket

Interfaces

  • bandwidthThrottle\tokenBucket\storage\scope\GlobalScope
  • bandwidthThrottle\tokenBucket\storage\scope\RequestScope
  • bandwidthThrottle\tokenBucket\storage\scope\SessionScope
  • bandwidthThrottle\tokenBucket\storage\Storage

Exceptions

  • bandwidthThrottle\tokenBucket\storage\StorageException
  • bandwidthThrottle\tokenBucket\TimeoutException
  • bandwidthThrottle\tokenBucket\TokenBucketException
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 
<?php

namespace bandwidthThrottle\tokenBucket\storage;

use bandwidthThrottle\tokenBucket\storage\scope\GlobalScope;
use bandwidthThrottle\tokenBucket\util\DoublePacker;
use Predis\Client;
use Predis\PredisException;
use malkusch\lock\mutex\PredisMutex;
use malkusch\lock\mutex\Mutex;

/**
 * Redis based storage which uses the Predis API.
 *
 * This storage is in the global scope.
 *
 * @author Markus Malkusch <markus@malkusch.de>
 * @link bitcoin:1335STSwu9hST4vcMRppEPgENMHD2r1REK Donations
 * @license WTFPL
 */
final class PredisStorage implements Storage, GlobalScope
{
    
    /**
     * @var Mutex The mutex.
     */
    private $mutex;
    
    /**
     * @var Client The redis API.
     */
    private $redis;
    
    /**
     * @var string The key.
     */
    private $key;
    
    /**
     * Sets the Redis API.
     *
     * @param string $name  The resource name.
     * @param Client $redis The Redis API.
     */
    public function __construct($name, Client $redis)
    {
        $this->key   = $name;
        $this->redis = $redis;
        $this->mutex = new PredisMutex([$redis], $name);
    }
    
    public function bootstrap($microtime)
    {
        $this->setMicrotime($microtime);
    }
    
    public function isBootstrapped()
    {
        try {
            return (bool) $this->redis->exists($this->key);
        } catch (PredisException $e) {
            throw new StorageException("Failed to check for key existence", 0, $e);
        }
    }
    
    public function remove()
    {
        try {
            if (!$this->redis->del($this->key)) {
                throw new StorageException("Failed to delete key");
            }
        } catch (PredisException $e) {
            throw new StorageException("Failed to delete key", 0, $e);
        }
    }
    
    /**
     * @SuppressWarnings(PHPMD)
     */
    public function setMicrotime($microtime)
    {
        try {
            $data = DoublePacker::pack($microtime);
            if (!$this->redis->set($this->key, $data)) {
                throw new StorageException("Failed to store microtime");
            }
        } catch (PredisException $e) {
            throw new StorageException("Failed to store microtime", 0, $e);
        }
    }

    /**
     * @SuppressWarnings(PHPMD)
     */
    public function getMicrotime()
    {
        try {
            $data = $this->redis->get($this->key);
            if ($data === false) {
                throw new StorageException("Failed to get microtime");
            }
            return DoublePacker::unpack($data);
        } catch (PredisException $e) {
            throw new StorageException("Failed to get microtime", 0, $e);
        }
    }

    public function getMutex()
    {
        return $this->mutex;
    }

    public function letMicrotimeUnchanged()
    {
    }
}
API documentation generated by ApiGen