hoojar studio
*
* 模块: wcore/speed.php
* 简述: 生成静态文件或缓冲memcached
* 作者: woods·zhang -> hoojar@163.com
* 版本: $id: speed.php 1 2012-11-20 05:55:12z administrator $
* 版权: copyright 2006-2013 慧佳工作室拥有此系统所有版权等知识产权
*
*/
class wcore_speed
{
/**
* 采用哪种类型加速
*
* @var string {file:文件类型 mem:memcached}
*/
private $_type = 'file';
/**
* 生成哪个类型的文件
*
* @var string 此参数只有type=file才生效
*/
private $_ext = '.html';
/**
* 缓冲在哪个目录当中
*
* @var string 如果type=file此处才生效
*/
private $_floder = '';
/**
* 过滤哪些get字段
*
* @var string 需要过滤的内容
*/
private $_filter = ',nocache,error,local,';
/**
* mem缓冲对象
*
* @var wcore_mem mem缓冲对象
*/
private $_mem = null;
/**
* 当前页面唯一编号 page unique id
*
* @var string 如果puid为空则代表不启动加速服务
*/
private $_puid = '';
/**
* 加速数据有效期(单位分钟)
*
* @var int 默认为10分钟
*/
private $_expire = 10;
/**
* 构造函数
*
* @param string $type 采用哪种类型加速{file:文件类型 mem:memcached}
* @param int $expire 加速数据有效期(单位分钟)默认为0是为了采用全局设置的有效期
* @param string $puid 缓冲时的唯一编号
* @param string $floder 如果type=file生效,缓冲在哪个目录当中
* @param string $ext 如果type=file生效,生成哪个类型的文件
*/
public function __construct($type = 'file', $expire = 0, $puid = '', $floder = '', $ext = '.html')
{
/**
* 判断是否启动加速服务,当有post数据时则不加速内容或者是否设定了启动加速内容常量且为真
*/
if (!empty($_post) || (defined('speed_data') && !speed_data))
{
return;
}
/**
* 初始化相关数据
*/
$this->_ext = empty($ext) ? $this->_ext : $ext;
$this->_type = (strtolower($type) == 'mem') ? 'mem' : 'file';
$this->_floder = empty($floder) ? $_server['document_root'] : $floder;
$expire = intval($expire); //加速数据有效期(单位分钟)
$this->_expire = ($expire > 0) ? $expire : (defined('speed_data_expire') ? speed_data_expire : 10);
/**
* 缓冲时的唯一编号
*/
if (!empty($puid))
{
$this->_puid = $puid;
}
else
{
$this->generate_puid(); //生成页面唯一页面编号
}
/**
* 判断采用哪种媒介存储,如果是采用mem就创建mem对象
*/
if ($this->_type == 'mem')
{
$this->_mem = wcore_object::mem();
}
}
/**
* 增加需要过滤的get字段
*
* @param string $str 需要过滤的get字段
* @return bool 增加成功返回true失败为false
*/
public function add_filter($str)
{
if (empty($str))
{
return false;
}
$this->_filter .= "{$str},";
return true;
}
/**
* 产生唯一编号若type类型为mem则在编号上加域名md5
*
* @return string 唯一编号
*/
public function generate_puid()
{
/**
* 判断是否有get数据若有数据则根据get数据生成编号
*/
$puid = '';
ksort($_get); //对get数组的key排序,尽量操持puid因get数据前后而不同
foreach ($_get as $k => $v)
{
if (strpos($this->_filter, ",{$k},") === false)
{
$puid .= $k . (empty($v) ? '' : "-{$v}-");
}
}
/**
* 判断由get数据组合而成的puid是否有数据,若没有的话就只以执行文件名编号
*/
if (empty($puid))
{
$puid = dirname($_server['script_name']) . strtok(basename($_server['script_name']), '.') . "{$puid}";
}
else
{
if ($puid[strlen($puid) - 1] == '-')
{
$puid = substr($puid, 0, -1);
}
$puid = strtok($_server['script_name'], '.') . "/{$puid}";
}
/**
* 根据存储类型与域名生成编号
*/
$domain = defined(domain_name) ? domain_name : (isset($_server['http_host']) ? $_server['http_host'] : ''); //主机域名
$this->_puid = ($this->_type == 'mem') ? md5("{$domain}{$puid}") : "{$puid}{$this->_ext}";
}
/**
* 获取先前加速已存储好的数据
*
* @return string 加速的内容
*/
public function &get_data()
{
$html = ''; //要返回的数据
if (isset($_get['nocache']) || empty($this->_puid) || !empty($_post))
{
return $html;
}
/**
* 采用memcached加速获取
*/
if ($this->_type == 'mem')
{
return $this->_mem->get('speed-data', $this->_puid);
}
/**
* 采用文件系统加速获取
*/
$filename = "{$this->_floder}/{$this->_puid}";
if (file_exists($filename))
{
$lcft = filemtime($filename); //last create file time 上次创建时间
if (($lcft + ($this->_expire * 60)) < time()) //加速内容过期了
{
return $html;
}
$html = file_get_contents($filename); //读取加速文件内容
}
return $html;
}
/**
* 存储要加速的数据到指定的媒介
*
* @param string $html 要存储的html内容
* @return bool 是否存储成功
*/
public function set_data(&$html = '')
{
if (empty($this->_puid))
{
return false;
}
if (empty($html))
{
$html = ob_get_flush();
}
/**
* 采用memcached加速存储
*/
if ($this->_type == 'mem')
{
return $this->_mem->set('speed-data', $this->_puid, $html, $this->_expire);
}
/**
* 采用文件系统加速存储
*/
$filename = "{$this->_floder}/{$this->_puid}";
$this->make_dir(dirname($filename));
file_put_contents($filename, $html);
return true;
}
/**
* 自动创建目录,可递归创建
*
* @param string $path 要创建的目录地址
* @return boolean 创建成功返回true失败为false
*/
public function make_dir($path)
{
if (empty($path))
{
return false;
}
if (!file_exists($path))
{
$this->make_dir(dirname($path));
@mkdir($path, 0777);
}
return true;
}
}
?>
2. [文件] object.php ~ 5kb
hoojar studio
*
* 模块: wcore/object.php
* 简述: 全局对象操作接口
* 作者: woods·zhang -> hoojar@163.com
* 版本: $id: object.php 1 2012-11-20 05:55:12z administrator $
* 版权: copyright 2006-2013 慧佳工作室拥有此系统所有版权等知识产权
*
*/
class wcore_object
{
/**
* 常用函数接口
*
* @var wcore_utils
*/
private static $_utils = null;
/**
* 提示函数接口
*
* @var wcore_tip
*/
private static $_tip = null;
/**
* 操作数据库接口
*
* @var wcore_mysql
*/
private static $_db = array();
/**
* 操作memcached库接口
*
* @var wcore_mem
*/
private static $_mem = null;
/**
* 操作memcached库接口
*
* @var smarty
*/
private static $_smarty = null;
/**
* 常用函数接口
*
* @return wcore_utils 返回常用函数对象
*/
public static function &utils()
{
if (is_object(self::$_utils))
{
return self::$_utils;
}
self::$_utils = new wcore_utils();
return self::$_utils;
}
/**
* 提示函数接口
*
* @return wcore_tip 返回常用函数对象
*/
public static function &tip()
{
if (is_object(self::$_tip))
{
return self::$_tip;
}
self::$_tip = new wcore_tip();
return self::$_tip;
}
/**
* 操作数据库接口
* @param string $name
* @return wcore_mssql|wcore_mysql|wcore_mysqli|wcore_oci 返回操作数据的对象
*/
public static function &db($name = '')
{
/**
* 判断数据库连接是否已生成数组连接池,是则定位到要调用的连接对象
*/
if (isset(self::$_db[$name]))
{
return self::$_db[$name]; //数据连接从连接池数组当中取
}
/**
* 生成数据连接数组池
*/
$db_servers = json_decode(db_servers, true);
foreach ($db_servers as $k => $v)
{
if ($k != $name)
{
continue; //若$name不为空就只注册连接需要打开的数据库对象
}
switch (strtolower($v['dbtype']))
{
case 'mysqli':
$db = new wcore_mysqli($v['host'], $v['user'], $v['pwd'], $v['dbname'], $v['charset'], $v['port'], $v['pconnect']);
break;
case 'oci':
$db = new wcore_oci($v['host'], $v['user'], $v['pwd'], $v['dbname'], $v['charset'], $v['port'], $v['pconnect']);
break;
case 'mssql':
$db = new wcore_mssql($v['host'], $v['user'], $v['pwd'], $v['dbname'], $v['charset'], $v['port'], $v['pconnect']);
break;
default:
$db = new wcore_mysql($v['host'], $v['user'], $v['pwd'], $v['dbname'], $v['charset'], $v['port'], $v['pconnect']);
break;
}
self::$_db[$k] = $db;
return $db;
}
exit("system can't connect '{$name}' connection name objects.");
}
/**
* 操作memcached库接口
*
* @return wcore_mem 返回操作数据的对象
*/
public static function &mem()
{
if (is_object(self::$_mem))
{
return self::$_mem;
}
$mem_servers = json_decode(mem_servers, true);
self::$_mem = new wcore_mem($mem_servers, mem_port, mem_use, mem_expire, mem_prefix);
return self::$_mem;
}
/**
* 操作smarty库接口
*
* @return smarty 返回操作smarty的对象
*/
public static function &smarty()
{
if (is_object(self::$_smarty))
{
return self::$_smarty;
}
require(dir_root . '/smarty/smarty.class.php');
$site_theme = get_site_theme(); //获取站点模板主题
$doc_root = get_doc_root_name(); //获取站点目录名称
/**
* smarty 缓冲目录
*/
$smarty_cache_dir = smarty_cache_dir . "{$doc_root}/{$site_theme}";
if (!file_exists($smarty_cache_dir))
{
@mkdir($smarty_cache_dir, 0777, true);
}
/**
* smarty 模板目录
*/
$smarty_template_dir = dir_root . "/{$doc_root}/site/{$site_theme}";
if (!file_exists($smarty_template_dir))
{
@mkdir($smarty_template_dir, 0777, true);
}
/**
* smarty 编译目录
*/
$smarty_compile_dir = smarty_compile_dir . "{$doc_root}/{$site_theme}";
if (!file_exists($smarty_compile_dir))
{
@mkdir($smarty_compile_dir, 0777, true);
}
self::$_smarty = new smarty();
self::$_smarty->caching = smarty_cache;
self::$_smarty->debugging = smarty_debugging;
self::$_smarty->cache_lifetime = smarty_cache_lifetime;
self::$_smarty->cache_dir = $smarty_cache_dir;
self::$_smarty->template_dir = $smarty_template_dir;
self::$_smarty->compile_dir = $smarty_compile_dir;
self::$_smarty->left_delimiter = smarty_left_delimiter;
self::$_smarty->right_delimiter = smarty_right_delimiter;
return self::$_smarty;
}
/**
* 选择或检查数据连接是否已加载,若没有加载则马上加载
*
* @param string $tname 操作表名
* @param string $lname 连接名称(master|slave)
* @return modules_dbase
*/
public static function &dbase($tname, $lname = '')
{
static $dbase_cls = null;
if (!isset($dbase_cls[$lname]))
{
$dbase_cls[$lname] = new modules_dbase();
$dbase_cls[$lname]->select_db_link($lname);
}
$dbase_cls[$lname]->_opt = $tname;
return $dbase_cls[$lname];
}
/**
* 主数据库连接操作(可写可读)
*
* @return wcore_mysql 返回操作数据的对象
*/
public static function mdb()
{
static $_db = null;
if (is_null($_db))
{
$_db = wcore_object::db('master');
}
return $_db;
}
/**
* 从数据库连接操作(只读)
*
* @return wcore_mysql 返回操作数据的对象
*/
public static function sdb()
{
static $_db = null;
if (is_null($_db))
{
$_db = wcore_object::db('slave');
}
return $_db;
}
}
?>