mirror of
https://github.com/torrentpier/torrentpier
synced 2025-08-20 13:24:01 -07:00
Перенос классов в файлы
Классы работы с базой данных, кеша, датастора переносим в отдельные файлы. Обычный require, но надо добавить require только при выбранности данного вида кеширования.
This commit is contained in:
parent
66455f879d
commit
80c99e7c8e
20 changed files with 1734 additions and 1652 deletions
71
library/includes/datastore/apc.php
Normal file
71
library/includes/datastore/apc.php
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_apc extends datastore_common
|
||||
{
|
||||
var $engine = 'APC';
|
||||
var $prefix = null;
|
||||
|
||||
function datastore_apc ($prefix = null)
|
||||
{
|
||||
if (!$this->is_installed())
|
||||
{
|
||||
die('Error: APC extension not installed');
|
||||
}
|
||||
$this->dbg_enabled = sql_dbg_enabled();
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
function store ($title, $var)
|
||||
{
|
||||
$this->data[$title] = $var;
|
||||
|
||||
$this->cur_query = "cache->set('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
return (bool) apc_store($this->prefix . $title, $var);
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
foreach ($this->known_items as $title => $script_name)
|
||||
{
|
||||
$this->cur_query = "cache->rm('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
apc_delete($this->prefix . $title);
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items)
|
||||
{
|
||||
$src = $this->_debug_find_caller('enqueue');
|
||||
trigger_error("Datastore: item '$item' already enqueued [$src]", E_USER_ERROR);
|
||||
}
|
||||
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->cur_query = "cache->get('$item')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->data[$item] = apc_fetch($this->prefix . $item);
|
||||
}
|
||||
}
|
||||
|
||||
function is_installed ()
|
||||
{
|
||||
return function_exists('apc_fetch');
|
||||
}
|
||||
}
|
175
library/includes/datastore/common.php
Normal file
175
library/includes/datastore/common.php
Normal file
|
@ -0,0 +1,175 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_common
|
||||
{
|
||||
/**
|
||||
* Директория с builder-скриптами (внутри INC_DIR)
|
||||
*/
|
||||
var $ds_dir = 'datastore/';
|
||||
/**
|
||||
* Готовая к употреблению data
|
||||
* array('title' => data)
|
||||
*/
|
||||
var $data = array();
|
||||
/**
|
||||
* Список элементов, которые будут извлечены из хранилища при первом же запросе get()
|
||||
* до этого момента они ставятся в очередь $queued_items для дальнейшего извлечения _fetch()'ем
|
||||
* всех элементов одним запросом
|
||||
* array('title1', 'title2'...)
|
||||
*/
|
||||
var $queued_items = array();
|
||||
|
||||
/**
|
||||
* 'title' => 'builder script name' inside "includes/datastore" dir
|
||||
*/
|
||||
var $known_items = array(
|
||||
'cat_forums' => 'build_cat_forums.php',
|
||||
'jumpbox' => 'build_cat_forums.php',
|
||||
'viewtopic_forum_select' => 'build_cat_forums.php',
|
||||
'latest_news' => 'build_cat_forums.php',
|
||||
'network_news' => 'build_cat_forums.php',
|
||||
'ads' => 'build_cat_forums.php',
|
||||
'moderators' => 'build_moderators.php',
|
||||
'stats' => 'build_stats.php',
|
||||
'ranks' => 'build_ranks.php',
|
||||
'attach_extensions' => 'build_attach_extensions.php',
|
||||
'smile_replacements' => 'build_smilies.php',
|
||||
);
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
function datastore_common () {}
|
||||
|
||||
/**
|
||||
* @param array(item1_title, item2_title...) or single item's title
|
||||
*/
|
||||
function enqueue ($items)
|
||||
{
|
||||
foreach ((array) $items as $item)
|
||||
{
|
||||
// игнор уже поставленного в очередь либо уже извлеченного
|
||||
if (!in_array($item, $this->queued_items) && !isset($this->data[$item]))
|
||||
{
|
||||
$this->queued_items[] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function &get ($title)
|
||||
{
|
||||
if (!isset($this->data[$title]))
|
||||
{
|
||||
$this->enqueue($title);
|
||||
$this->_fetch();
|
||||
}
|
||||
return $this->data[$title];
|
||||
}
|
||||
|
||||
function store ($item_name, $item_data) {}
|
||||
|
||||
function rm ($items)
|
||||
{
|
||||
foreach ((array) $items as $item)
|
||||
{
|
||||
unset($this->data[$item]);
|
||||
}
|
||||
}
|
||||
|
||||
function update ($items)
|
||||
{
|
||||
if ($items == 'all')
|
||||
{
|
||||
$items = array_keys(array_unique($this->known_items));
|
||||
}
|
||||
foreach ((array) $items as $item)
|
||||
{
|
||||
$this->_build_item($item);
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch ()
|
||||
{
|
||||
$this->_fetch_from_store();
|
||||
|
||||
foreach ($this->queued_items as $title)
|
||||
{
|
||||
if (!isset($this->data[$title]) || $this->data[$title] === false)
|
||||
{
|
||||
$this->_build_item($title);
|
||||
}
|
||||
}
|
||||
|
||||
$this->queued_items = array();
|
||||
}
|
||||
|
||||
function _fetch_from_store () {}
|
||||
|
||||
function _build_item ($title)
|
||||
{
|
||||
if (!empty($this->known_items[$title]))
|
||||
{
|
||||
require(INC_DIR . $this->ds_dir . $this->known_items[$title]);
|
||||
}
|
||||
else
|
||||
{
|
||||
trigger_error("Unknown datastore item: $title", E_USER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
var $num_queries = 0;
|
||||
var $sql_starttime = 0;
|
||||
var $sql_inittime = 0;
|
||||
var $sql_timetotal = 0;
|
||||
var $cur_query_time = 0;
|
||||
|
||||
var $dbg = array();
|
||||
var $dbg_id = 0;
|
||||
var $dbg_enabled = false;
|
||||
var $cur_query = null;
|
||||
|
||||
function debug ($mode, $cur_query = null)
|
||||
{
|
||||
if (!$this->dbg_enabled) return;
|
||||
|
||||
$id =& $this->dbg_id;
|
||||
$dbg =& $this->dbg[$id];
|
||||
|
||||
if ($mode == 'start')
|
||||
{
|
||||
$this->sql_starttime = utime();
|
||||
|
||||
$dbg['sql'] = isset($cur_query) ? short_query($cur_query) : short_query($this->cur_query);
|
||||
$dbg['src'] = $this->debug_find_source();
|
||||
$dbg['file'] = $this->debug_find_source('file');
|
||||
$dbg['line'] = $this->debug_find_source('line');
|
||||
$dbg['time'] = '';
|
||||
}
|
||||
else if ($mode == 'stop')
|
||||
{
|
||||
$this->cur_query_time = utime() - $this->sql_starttime;
|
||||
$this->sql_timetotal += $this->cur_query_time;
|
||||
$dbg['time'] = $this->cur_query_time;
|
||||
$id++;
|
||||
}
|
||||
}
|
||||
|
||||
function debug_find_source ($mode = '')
|
||||
{
|
||||
foreach (debug_backtrace() as $trace)
|
||||
{
|
||||
if ($trace['file'] !== __FILE__)
|
||||
{
|
||||
switch ($mode)
|
||||
{
|
||||
case 'file': return $trace['file'];
|
||||
case 'line': return $trace['line'];
|
||||
default: return hide_bb_path($trace['file']) .'('. $trace['line'] .')';
|
||||
}
|
||||
}
|
||||
}
|
||||
return 'src not found';
|
||||
}
|
||||
}
|
87
library/includes/datastore/file.php
Normal file
87
library/includes/datastore/file.php
Normal file
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_file extends datastore_common
|
||||
{
|
||||
var $dir = null;
|
||||
var $prefix = null;
|
||||
var $engine = 'Filecache';
|
||||
|
||||
function datastore_file ($dir, $prefix = null)
|
||||
{
|
||||
$this->prefix = $prefix;
|
||||
$this->dir = $dir;
|
||||
$this->dbg_enabled = sql_dbg_enabled();
|
||||
}
|
||||
|
||||
function store ($title, $var)
|
||||
{
|
||||
$this->cur_query = "cache->set('$title')";
|
||||
$this->debug('start');
|
||||
|
||||
$this->data[$title] = $var;
|
||||
|
||||
$filename = $this->dir . clean_filename($this->prefix . $title) . '.php';
|
||||
|
||||
$filecache = "<?php\n";
|
||||
$filecache .= "if (!defined('BB_ROOT')) die(basename(__FILE__));\n";
|
||||
$filecache .= '$filecache = ' . var_export($var, true) . ";\n";
|
||||
$filecache .= '?>';
|
||||
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
return (bool) file_write($filecache, $filename, false, true, true);
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
$dir = $this->dir;
|
||||
|
||||
if (is_dir($dir))
|
||||
{
|
||||
if ($dh = opendir($dir))
|
||||
{
|
||||
while (($file = readdir($dh)) !== false)
|
||||
{
|
||||
if ($file != "." && $file != "..")
|
||||
{
|
||||
$filename = $dir . $file;
|
||||
|
||||
unlink($filename);
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items)
|
||||
{
|
||||
$src = $this->_debug_find_caller('enqueue');
|
||||
trigger_error("Datastore: item '$item' already enqueued [$src]", E_USER_ERROR);
|
||||
}
|
||||
|
||||
foreach($items as $item)
|
||||
{
|
||||
$filename = $this->dir . $this->prefix . $item . '.php';
|
||||
|
||||
$this->cur_query = "cache->get('$item')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
if(file_exists($filename))
|
||||
{
|
||||
require($filename);
|
||||
|
||||
$this->data[$item] = $filecache;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
103
library/includes/datastore/memcache.php
Normal file
103
library/includes/datastore/memcache.php
Normal file
|
@ -0,0 +1,103 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_memcache extends datastore_common
|
||||
{
|
||||
var $cfg = null;
|
||||
var $memcache = null;
|
||||
var $connected = false;
|
||||
var $engine = 'Memcache';
|
||||
var $prefix = null;
|
||||
|
||||
function datastore_memcache ($cfg, $prefix = null)
|
||||
{
|
||||
if (!$this->is_installed())
|
||||
{
|
||||
die('Error: Memcached extension not installed');
|
||||
}
|
||||
|
||||
$this->cfg = $cfg;
|
||||
$this->prefix = $prefix;
|
||||
$this->memcache = new Memcache;
|
||||
$this->dbg_enabled = sql_dbg_enabled();
|
||||
}
|
||||
|
||||
function connect ()
|
||||
{
|
||||
$connect_type = ($this->cfg['pconnect']) ? 'pconnect' : 'connect';
|
||||
|
||||
$this->cur_query = $connect_type .' '. $this->cfg['host'] .':'. $this->cfg['port'];
|
||||
$this->debug('start');
|
||||
|
||||
if (@$this->memcache->$connect_type($this->cfg['host'], $this->cfg['port']))
|
||||
{
|
||||
$this->connected = true;
|
||||
}
|
||||
|
||||
if (DBG_LOG) dbg_log(' ', 'CACHE-connect'. ($this->connected ? '' : '-FAIL'));
|
||||
|
||||
if (!$this->connected && $this->cfg['con_required'])
|
||||
{
|
||||
die('Could not connect to memcached server');
|
||||
}
|
||||
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
}
|
||||
|
||||
function store ($title, $var)
|
||||
{
|
||||
if (!$this->connected) $this->connect();
|
||||
$this->data[$title] = $var;
|
||||
|
||||
$this->cur_query = "cache->set('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
return (bool) $this->memcache->set($this->prefix . $title, $var);
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
if (!$this->connected) $this->connect();
|
||||
foreach ($this->known_items as $title => $script_name)
|
||||
{
|
||||
$this->cur_query = "cache->rm('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->memcache->delete($this->prefix . $title, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items)
|
||||
{
|
||||
$src = $this->_debug_find_caller('enqueue');
|
||||
trigger_error("Datastore: item '$item' already enqueued [$src]", E_USER_ERROR);
|
||||
}
|
||||
|
||||
if (!$this->connected) $this->connect();
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->cur_query = "cache->get('$item')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->data[$item] = $this->memcache->get($this->prefix . $item);
|
||||
}
|
||||
}
|
||||
|
||||
function is_installed ()
|
||||
{
|
||||
return class_exists('Memcache');
|
||||
}
|
||||
}
|
99
library/includes/datastore/redis.php
Normal file
99
library/includes/datastore/redis.php
Normal file
|
@ -0,0 +1,99 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_redis extends datastore_common
|
||||
{
|
||||
var $cfg = null;
|
||||
var $redis = null;
|
||||
var $prefix = null;
|
||||
var $connected = false;
|
||||
var $engine = 'Redis';
|
||||
|
||||
function datastore_redis ($cfg, $prefix = null)
|
||||
{
|
||||
if (!$this->is_installed())
|
||||
{
|
||||
die('Error: Redis extension not installed');
|
||||
}
|
||||
|
||||
$this->cfg = $cfg;
|
||||
$this->redis = new Redis();
|
||||
$this->dbg_enabled = sql_dbg_enabled();
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
function connect ()
|
||||
{
|
||||
$this->cur_query = 'connect '. $this->cfg['host'] .':'. $this->cfg['port'];
|
||||
$this->debug('start');
|
||||
|
||||
if (@$this->redis->connect($this->cfg['host'],$this->cfg['port']))
|
||||
{
|
||||
$this->connected = true;
|
||||
}
|
||||
|
||||
if (!$this->connected && $this->cfg['con_required'])
|
||||
{
|
||||
die('Could not connect to redis server');
|
||||
}
|
||||
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
}
|
||||
|
||||
function store ($title, $var)
|
||||
{
|
||||
if (!$this->connected) $this->connect();
|
||||
$this->data[$title] = $var;
|
||||
|
||||
$this->cur_query = "cache->set('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
return (bool) $this->redis->set($this->prefix . $title, serialize($var));
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
if (!$this->connected) $this->connect();
|
||||
foreach ($this->known_items as $title => $script_name)
|
||||
{
|
||||
$this->cur_query = "cache->rm('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->redis->del($this->prefix . $title);
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items)
|
||||
{
|
||||
$src = $this->_debug_find_caller('enqueue');
|
||||
trigger_error("Datastore: item '$item' already enqueued [$src]", E_USER_ERROR);
|
||||
}
|
||||
|
||||
if (!$this->connected) $this->connect();
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->cur_query = "cache->get('$item')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->data[$item] = unserialize($this->redis->get($this->prefix . $item));
|
||||
}
|
||||
}
|
||||
|
||||
function is_installed ()
|
||||
{
|
||||
return class_exists('Redis');
|
||||
}
|
||||
}
|
66
library/includes/datastore/sqlite.php
Normal file
66
library/includes/datastore/sqlite.php
Normal file
|
@ -0,0 +1,66 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_sqlite extends datastore_common
|
||||
{
|
||||
var $engine = 'SQLite';
|
||||
var $db = null;
|
||||
var $prefix = null;
|
||||
var $cfg = array(
|
||||
'db_file_path' => '/path/to/datastore.db.sqlite',
|
||||
'table_name' => 'datastore',
|
||||
'table_schema' => 'CREATE TABLE datastore (
|
||||
ds_title VARCHAR(255),
|
||||
ds_data TEXT,
|
||||
PRIMARY KEY (ds_title)
|
||||
)',
|
||||
'pconnect' => true,
|
||||
'con_required' => true,
|
||||
'log_name' => 'DATASTORE',
|
||||
);
|
||||
|
||||
function datastore_sqlite ($cfg, $prefix = null)
|
||||
{
|
||||
$this->cfg = array_merge($this->cfg, $cfg);
|
||||
$this->db = new sqlite_common($this->cfg);
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
function store ($item_name, $item_data)
|
||||
{
|
||||
$this->data[$item_name] = $item_data;
|
||||
|
||||
$ds_title = sqlite_escape_string($this->prefix . $item_name);
|
||||
$ds_data = sqlite_escape_string(serialize($item_data));
|
||||
|
||||
$result = $this->db->query("REPLACE INTO ". $this->cfg['table_name'] ." (ds_title, ds_data) VALUES ('$ds_title', '$ds_data')");
|
||||
|
||||
return (bool) $result;
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
$this->db->query("DELETE FROM ". $this->cfg['table_name']);
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items) return;
|
||||
|
||||
$prefix_len = strlen($this->prefix);
|
||||
$prefix_sql = sqlite_escape_string($this->prefix);
|
||||
|
||||
array_deep($items, 'sqlite_escape_string');
|
||||
$items_list = $prefix_sql . join("','$prefix_sql", $items);
|
||||
|
||||
$rowset = $this->db->fetch_rowset("SELECT ds_title, ds_data FROM ". $this->cfg['table_name'] ." WHERE ds_title IN ('$items_list')");
|
||||
|
||||
$this->db->debug('start', "unserialize()");
|
||||
foreach ($rowset as $row)
|
||||
{
|
||||
$this->data[substr($row['ds_title'], $prefix_len)] = unserialize($row['ds_data']);
|
||||
}
|
||||
$this->db->debug('stop');
|
||||
}
|
||||
}
|
72
library/includes/datastore/xcache.php
Normal file
72
library/includes/datastore/xcache.php
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
if (!defined('BB_ROOT')) die(basename(__FILE__));
|
||||
|
||||
class datastore_xcache extends datastore_common
|
||||
{
|
||||
var $prefix = null;
|
||||
var $engine = 'XCache';
|
||||
|
||||
function datastore_xcache ($prefix = null)
|
||||
{
|
||||
if (!$this->is_installed())
|
||||
{
|
||||
die('Error: XCache extension not installed');
|
||||
}
|
||||
|
||||
$this->dbg_enabled = sql_dbg_enabled();
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
function store ($title, $var)
|
||||
{
|
||||
$this->data[$title] = $var;
|
||||
|
||||
$this->cur_query = "cache->set('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
return (bool) xcache_set($this->prefix . $title, $var);
|
||||
}
|
||||
|
||||
function clean ()
|
||||
{
|
||||
foreach ($this->known_items as $title => $script_name)
|
||||
{
|
||||
$this->cur_query = "cache->rm('$title')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
xcache_unset($this->prefix . $title);
|
||||
}
|
||||
}
|
||||
|
||||
function _fetch_from_store ()
|
||||
{
|
||||
if (!$items = $this->queued_items)
|
||||
{
|
||||
$src = $this->_debug_find_caller('enqueue');
|
||||
trigger_error("Datastore: item '$item' already enqueued [$src]", E_USER_ERROR);
|
||||
}
|
||||
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$this->cur_query = "cache->set('$item')";
|
||||
$this->debug('start');
|
||||
$this->debug('stop');
|
||||
$this->cur_query = null;
|
||||
$this->num_queries++;
|
||||
|
||||
$this->data[$item] = xcache_get($this->prefix . $item);
|
||||
}
|
||||
}
|
||||
|
||||
function is_installed ()
|
||||
{
|
||||
return function_exists('xcache_get');
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue