Система управления «Сайт PRO»
Версия 20240107

Класс Redis

Объект $Redis: Cms\Root\Redis наследует Cms\Site\Base

Объект для кэширования Redis.

Исходный код
class Redis extends \Cms\Site\Base { … }

Свойства

$prefix

$Redis->prefix = 'http://localhost';
Исходный код
    var $prefix = 'http://localhost';

$expire

$Redis->expire = 1000;
Исходный код
    var $expire = 1000;

$F

$Redis->F
Исходный код
    var $F;

Методы

__construct()

new Redis($prefix=null, $host='127.0.0.1', $port=6379);

Конструктор

Параметры:

ИмяОписание
$prefix

string

$host

string

$port

int

Исходный код
    function __construct($prefix = null, $host = '127.0.0.1', $port = 6379) {
        if (isset($prefix)) $this->prefix = $prefix;
        elseif (isset($_SERVER['HTTP_HOST'])) $this->prefix = 'http://' . $_SERVER['HTTP_HOST'];
        $this->F = @fsockopen($host, $port, $errno, $errstr, 1);
    }

route()

$Redis->route();

Обработка HTTP-запроса

Возвращает: true – запрос обработан; null – запрос не обработан

Исходный код
    function route() {
        $cache = true;
        if ($_COOKIE) $cache = false;
        if ($_SERVER['REQUEST_METHOD'] === 'POST') $cache = false;
        if (strpos($_SERVER['REQUEST_URI'], '?') !== false) $cache = false;

        if (!$cache) return;

        if (is_array($data = $this->get($_SERVER['REQUEST_URI']))) {
            while (ob_end_clean()) {}
            foreach ($data['head'] as $header) header($header);
            header('X-Cache: HIT');
            print $data['html'];
            exit;
        }

        $App = $this->App();
        $Auth = $App->Auth();
        $Main = $App->Main();
        $Request = $Main->Request();
        $Display = $Main->Display();

        $App->init(true);

        print $Display->html();

        $Request->sendStatus();
        $Request->sendHeader();
        $Request->sendCookie();

        if ($status = ob_get_status()) {
            for ($i = $status['level'] - $Request->ob_status['level']; $i > 1; $i --) ob_end_flush();
            $html = ob_get_clean();
            # Content-Length
            if (!headers_sent()) {
                $header = 'Content-Length: ' . strlen($html);
                header($header);
            }
        }

        $head = array();
        foreach (headers_list() as $h) if (substr($h, 0, 11) !== 'Set-Cookie:') $head[] = $h;
        if (strlen($Request->status_header))
        $head[] = $Request->status_header;
        $this->set($_SERVER['REQUEST_URI'], array(
            'html' => $html,
            'head' => $head,
        ));

        header('X-Cache: MISS');
        print $html;
        exit;
    }

set()

$Redis->set($key, $value);

Установка значения

Параметры:

ИмяОписание
$key

string

$value

string

Возвращает: boolean

Исходный код
    function set($key, $value) {
        $cmd = 'SETEX';
        $key = $this->prefix . $key;
        $value = serialize($value);
        $expire = $this->expire;
        if (!$this->write('*4'
         . "\r\n\$" . strlen($cmd) . "\r\n" . $cmd
         . "\r\n\$" . strlen($key) . "\r\n" . $key
         . "\r\n\$" . strlen($expire) . "\r\n" . $expire
         . "\r\n\$" . strlen($value) . "\r\n" . $value
         . "\r\n"
        )) return false;
        if (is_bool($result = $this->read())) return $result;
        return true;
    }

get()

$Redis->get($key);

Получение значения

Параметры:

ИмяОписание
$key

string

Возвращает: any

Исходный код
    function get($key) {
        $cmd = 'GET';
        $key = $this->prefix . $key;
        if (!$this->write('*2'
         . "\r\n\$" . strlen($cmd) . "\r\n" . $cmd
         . "\r\n\$" . strlen($key) . "\r\n" . $key
         . "\r\n"
        )) return false;
        if (is_bool($result = $this->read())) return $result;
        return unserialize($result);
    }

del()

$Redis->del($key);

Удаление значения

Параметры:

ИмяОписание
$key

string

Возвращает: boolean

Исходный код
    function del($key) {
        $cmd = "DEL";
        $key = $this->prefix . $key;
        if (!$this->write("*2"
         . "\r\n\$" . strlen($cmd) . "\r\n" . $cmd
         . "\r\n\$" . strlen($key) . "\r\n" . $key
         . "\r\n"
        )) return false;
        if (is_bool($result = $this->read())) return $result;
        return $result;
    }

clear()

$Redis->clear();

Удаление всех значений

Исходный код
    function clear() {
        if (is_array($keys = $this->keys())) foreach ($keys as $key) $this->del($key);
    }

keys()

$Redis->keys($key=' *');

Список ключей

Возвращает: array|false

Исходный код
    function keys($key = '*') {
        $cmd = 'KEYS';
        if (!$this->write('*2'
         . "\r\n\$" . strlen($cmd) . "\r\n" . $cmd
         . "\r\n\$" . strlen($key) . "\r\n" . $key
         . "\r\n"
        )) return false;
        if (is_bool($result = $this->read())) return $result;
        if (is_array($result)) {
            $a = array();
            $prefix = $this->prefix;
            $length = strlen($prefix);
            foreach ($result as $i => $key) if (substr($key, 0, $length) == $prefix) $a[] = substr($key, $length);
            return $a;
        }
        return $result;
    }

write()

$Redis->write($data);

Запись данных

Параметры:

ИмяОписание
$data

string данные

Возвращает: boolean

Исходный код
    function write($data) {
        if (!$this->F) return false;
        $length = strlen($data);
        $fwrite = 0;
        for ($written = 0; $written < $length; $written += $fwrite) {
            if ($fwrite = fwrite($this->F, substr($data, $written))) continue;
            else return false;
        }
        return true;
    }

read()

$Redis->read();

Чтение данных

Возвращает: boolean|int|string|array

Исходный код
    function read() {
        if (!$this->F) return false;
        $line = rtrim(fgets($this->F), "\r\n");
        if ($line[0] === '+') return true;
        if ($line[0] === '-') return false;
        if ($line[0] === ':') return intval(substr($line, 1));
        if ($line[0] === '$') return $this->readBulk(intval(substr($line, 1)));
        if ($line[0] === '*') return $this->readMultiBulk(intval(substr($line, 1)));
        return $line;
    }

readBulk()

$Redis->readBulk($length);

Чтение нескольких пакетов данных

Параметры:

ИмяОписание
$length

int длина данных

Возвращает: string|false

Исходный код
    function readBulk($length) {
        if (!$this->F) return false;
        if ($length < 0) return null;
        for ($data = ''; strlen($data) < $length;) {
            if (strlen($line = fread($this->F, $length - strlen($data)))) {
                $data .= $line;
                continue;
            } else {
                return false;
            }
        }
        fgets($this->F);
        return $data;
    }

readMultiBulk()

$Redis->readMultiBulk($length);

Чтение массива пакетов данных

Параметры:

ИмяОписание
$length

int длина данных

Возвращает: array|false

Исходный код
    function readMultiBulk($length) {
        $a = array();
        for ($i = 0; $i < $length; $i ++) {
            if (is_bool($result = $this->read())) return $result;
            $a[] = $result;
        }
        return $a;
    }