conn = new Redis(); // Afterwards we attempt to connect to the server $socketType = $providerConfig['socket_type']; if ($socketType === 'unix') $success = $this->conn->connect($providerConfig['socket']); elseif ($socketType === 'tcp') $success = $this->conn->connect($providerConfig['host'], $providerConfig['port'], $providerConfig['timeout']); else $success = false; // If failed, throw an exception informing so if (!$success) throw new ObjectStorageException("Could not load RedisProvider ObjectStorage. Unable to connect to server."); // If authentication is required, attempt to do so with the provided password if (isset($providerConfig['password']) && !$this->conn->auth($providerConfig['password'])) throw new ObjectStorageException("Could not load RedisProvider ObjectStorage. Authentication failure."); // If a db_index is provided, use that one accordingly if (isset($providerConfig['db_index']) && is_int($providerConfig['db_index'])) $this->conn->select($providerConfig['db_index']); // And if all goes well, report a true return true; // If any sort of failure has occurred along the way, } catch (RedisException $e) { throw new ObjectStorageException("Could not load RedisProvider ObjectStorage. RedisException thrown: '" . $e->getMessage() . "'"); } } public function getIndex(): array { return $this->conn->sMembers('ObjectStorageIndex'); } public function getItem(string $key) { // If the requested key is not part of the index, this item is not tracked and should therefore // return null. if (!$this->conn->sIsMember('ObjectStorageIndex', $key)) return null; // If the data doesn't exist, return null if (!$this->conn->hExists('fwstorage_' . $key, 'data')) return null; return unserialize($this->conn->hGet('fwstorage_' . $key, 'data')); } public function getItemMeta(string $key): ?array { // If the requested key is not part of the index, this item is not tracked and should therefore // return null. if (!$this->conn->sIsMember('ObjectStorageIndex', $key)) return null; // If the data doesn't exist, return null if (!$this->conn->hExists('fwstorage_' . $key, 'meta')) return null; return unserialize($this->conn->hGet('fwstorage_' . $key, 'meta')); } public function getItems(array $keys = []): array { $output = []; foreach ($keys as $key) $output[$key] = $this->getItem($key); return $output; } public function hasItem(string $key): bool { return $this->conn->sIsMember('ObjectStorageIndex', $key); } public function clear(): bool { return $this->deleteItems($this->getIndex()); } public function deleteItem(string $key): bool { // If the requested key is not part of the index, this item is not tracked and should therefore // return null. if ($this->conn->sIsMember('ObjectStorageIndex', $key)) $this->conn->sRem('ObjectStorageIndex', $key); if ($this->conn->exists('fwstorage_' . $key)) $this->conn->del('fwstorage_' . $key); return true; } public function deleteItems(array $keys): bool { foreach ($keys as $key) $this->deleteItem($key); return true; } public function save(string $key, $value, array $metaData = []): bool { // If the requested key is not part of the index, this item is not tracked and should therefore // return null. if (!$this->conn->sIsMember('ObjectStorageIndex', $key)) $this->conn->sAdd('ObjectStorageIndex', $key); // Write to the hash $this->conn->hSet('fwstorage_' . $key, 'data', serialize($value)); $this->conn->hSet('fwstorage_' . $key, 'meta', serialize($metaData)); return true; } }