Класс Redis
Объект $Redis:
Объект для кэширования 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 |
|
$host |
|
$port |
|
Исходный код
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 |
|
$value |
|
Возвращает: 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 |
|
Возвращает: 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 |
|
Возвращает: 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 |
|
Возвращает: 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 |
|
Возвращает: 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 |
|
Возвращает: 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;
}