小程序安装包生成
3
.gitignore
vendored
@ -10,6 +10,5 @@ logs
|
||||
*.lock
|
||||
#Upload
|
||||
#upload
|
||||
Cache
|
||||
cache
|
||||
.tea
|
||||
AppMini/New/*
|
@ -51,7 +51,7 @@ App({
|
||||
// 请求地址
|
||||
request_url: "{{request_url}}";
|
||||
//request_url: "https://demo.shopxo.net/",
|
||||
//request_url: 'http://localhost/project/shopxo/service/',
|
||||
//request_url: 'http://localhost/project/shopxo/',
|
||||
|
||||
// 基础信息
|
||||
application_title: "{{application_title}}",
|
||||
|
2
Application/Admin/Lang/zh-cn/appminialipaylist.php
Normal file → Executable file
@ -10,7 +10,7 @@
|
||||
return array(
|
||||
'appmini_alipaylist_name_text' => '包名',
|
||||
'appmini_alipaylist_size_text' => '大小',
|
||||
'appmini_alipaylist_created_msg' => '生成时间比较长,请耐心等待,不要关闭浏览器窗口!',
|
||||
'appmini_alipaylist_created_msg' => '生成时间比较长,请不要关闭浏览器窗口!',
|
||||
'appmini_alipaylist_created_copy_error' => '项目包复制失败',
|
||||
'appmini_alipaylist_config_error' => '配置信息不能为空',
|
||||
'appmini_alipaylist_file_error' => '包基础文件不存在,请重新生成',
|
||||
|
@ -27,7 +27,7 @@
|
||||
<td>{{$v.size}}</td>
|
||||
<td>{{$v.time}}</td>
|
||||
<td class="view-operation">
|
||||
<a href="{{$v.url)}}">
|
||||
<a href="{{$v.url}}">
|
||||
<button class="am-btn am-btn-default am-btn-xs am-radius am-icon-download"> {{:L('common_operation_download')}}</button>
|
||||
</a>
|
||||
<button class="am-btn am-btn-default am-btn-xs am-radius am-icon-trash-o submit-delete" data-url="{{:U('Admin/AppMiniAlipayList/Delete')}}" data-id="{{$v.name}}" data-view="reload"> {{:L('common_operation_delete')}}</button>
|
||||
|
0
Application/Api/Controller/CartController.class.php
Normal file → Executable file
0
Application/Api/Controller/UserGoodsBrowseController.class.php
Normal file → Executable file
0
Application/Api/Controller/UserIntegralController.class.php
Normal file → Executable file
0
Application/Library/BaiduAuth.class.php
Normal file → Executable file
0
Application/Library/FileUtil.class.php
Normal file → Executable file
0
Application/Library/Payment/AlipayMini.class.php
Normal file → Executable file
0
Application/Library/ZipFolder.class.php
Normal file → Executable file
0
Application/Service/IntegralService.class.php
Normal file → Executable file
6
Install/shopxo.sql
Normal file → Executable file
0
Public/Admin/Default/Css/IconfontMenu.css
Normal file → Executable file
0
Public/Upload/alipay_life_menu/2018/10/31/2018103118024817275.png
Normal file → Executable file
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
0
Public/Upload/alipay_life_message/2018/10/30/2018103014473436465.png
Normal file → Executable file
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
0
Public/Upload/alipay_life_message/2018/10/31/2018103118005812989.png
Normal file → Executable file
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
0
Public/Upload/app_home_nav/2018/11/19/2018111915461980516.png
Normal file → Executable file
Before Width: | Height: | Size: 730 B After Width: | Height: | Size: 730 B |
0
Public/Upload/app_home_nav/2018/11/19/2018111915473948001.png
Normal file → Executable file
Before Width: | Height: | Size: 894 B After Width: | Height: | Size: 894 B |
0
Public/Upload/app_home_nav/2018/11/19/2018111915482687655.png
Normal file → Executable file
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
0
Public/Upload/app_home_nav/2018/11/19/2018111915491258361.png
Normal file → Executable file
Before Width: | Height: | Size: 879 B After Width: | Height: | Size: 879 B |
0
Public/Upload/goods_category/2018/11/20/2018112015245128143.jpeg
Normal file → Executable file
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
0
Public/Upload/goods_category/2018/11/20/2018112015252193663.jpeg
Normal file → Executable file
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
0
Public/Upload/goods_category/2018/11/20/2018112015255390903.jpeg
Normal file → Executable file
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
0
Public/Upload/goods_category/2018/11/20/2018112015265213067.png
Normal file → Executable file
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
0
Public/Upload/goods_category/2018/11/20/2018112015273175122.jpeg
Normal file → Executable file
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
Public/Upload/goods_category/2018/11/20/2018112015441996472.jpeg
Normal file → Executable file
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
124
ThinkPHP/Library/Think/Cache/Driver/Apachenote.class.php
Executable file
@ -0,0 +1,124 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Apachenote缓存驱动
|
||||
*/
|
||||
class Apachenote extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if(!empty($options)) {
|
||||
$this->options = $options;
|
||||
}
|
||||
if(empty($options)) {
|
||||
$options = array (
|
||||
'host' => '127.0.0.1',
|
||||
'port' => 1042,
|
||||
'timeout' => 10,
|
||||
);
|
||||
}
|
||||
$this->options = $options;
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->handler = null;
|
||||
$this->open();
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
$this->open();
|
||||
$name = $this->options['prefix'].$name;
|
||||
$s = 'F' . pack('N', strlen($name)) . $name;
|
||||
fwrite($this->handler, $s);
|
||||
|
||||
for ($data = ''; !feof($this->handler);) {
|
||||
$data .= fread($this->handler, 4096);
|
||||
}
|
||||
N('cache_read',1);
|
||||
$this->close();
|
||||
return $data === '' ? '' : unserialize($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value) {
|
||||
N('cache_write',1);
|
||||
$this->open();
|
||||
$value = serialize($value);
|
||||
$name = $this->options['prefix'].$name;
|
||||
$s = 'S' . pack('NN', strlen($name), strlen($value)) . $name . $value;
|
||||
|
||||
fwrite($this->handler, $s);
|
||||
$ret = fgets($this->handler);
|
||||
$this->close();
|
||||
if($ret === "OK\n") {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
$this->open();
|
||||
$name = $this->options['prefix'].$name;
|
||||
$s = 'D' . pack('N', strlen($name)) . $name;
|
||||
fwrite($this->handler, $s);
|
||||
$ret = fgets($this->handler);
|
||||
$this->close();
|
||||
return $ret === "OK\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭缓存
|
||||
* @access private
|
||||
*/
|
||||
private function close() {
|
||||
fclose($this->handler);
|
||||
$this->handler = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 打开缓存
|
||||
* @access private
|
||||
*/
|
||||
private function open() {
|
||||
if (!is_resource($this->handler)) {
|
||||
$this->handler = fsockopen($this->options['host'], $this->options['port'], $_, $_, $this->options['timeout']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
86
ThinkPHP/Library/Think/Cache/Driver/Apc.class.php
Executable file
@ -0,0 +1,86 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Apc缓存驱动
|
||||
*/
|
||||
class Apc extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if(!function_exists('apc_cache_info')) {
|
||||
E(L('_NOT_SUPPORT_').':Apc');
|
||||
}
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
return apc_fetch($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if($result = apc_store($name, $value, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return apc_delete($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return apc_clear_cache();
|
||||
}
|
||||
|
||||
}
|
138
ThinkPHP/Library/Think/Cache/Driver/Db.class.php
Executable file
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* 数据库方式缓存驱动
|
||||
* CREATE TABLE think_cache (
|
||||
* cachekey varchar(255) NOT NULL,
|
||||
* expire int(11) NOT NULL,
|
||||
* data blob,
|
||||
* datacrc int(32),
|
||||
* UNIQUE KEY `cachekey` (`cachekey`)
|
||||
* );
|
||||
*/
|
||||
class Db extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if(empty($options)) {
|
||||
$options = array (
|
||||
'table' => C('DATA_CACHE_TABLE'),
|
||||
);
|
||||
}
|
||||
$this->options = $options;
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->handler = \Think\Db::getInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
$name = $this->options['prefix'].addslashes($name);
|
||||
N('cache_read',1);
|
||||
$result = $this->handler->query('SELECT `data`,`datacrc` FROM `'.$this->options['table'].'` WHERE `cachekey`=\''.$name.'\' AND (`expire` =0 OR `expire`>'.time().') LIMIT 0,1');
|
||||
if(false !== $result ) {
|
||||
$result = $result[0];
|
||||
if(C('DATA_CACHE_CHECK')) {//开启数据校验
|
||||
if($result['datacrc'] != md5($result['data'])) {//校验错误
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$content = $result['data'];
|
||||
if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//启用数据压缩
|
||||
$content = gzuncompress($content);
|
||||
}
|
||||
$content = unserialize($content);
|
||||
return $content;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value,$expire=null) {
|
||||
$data = serialize($value);
|
||||
$name = $this->options['prefix'].addslashes($name);
|
||||
N('cache_write',1);
|
||||
if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//数据压缩
|
||||
$data = gzcompress($data,3);
|
||||
}
|
||||
if(C('DATA_CACHE_CHECK')) {//开启数据校验
|
||||
$crc = md5($data);
|
||||
}else {
|
||||
$crc = '';
|
||||
}
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$expire = ($expire==0)?0: (time()+$expire) ;//缓存有效期为0表示永久缓存
|
||||
$result = $this->handler->query('select `cachekey` from `'.$this->options['table'].'` where `cachekey`=\''.$name.'\' limit 0,1');
|
||||
if(!empty($result) ) {
|
||||
//更新记录
|
||||
$result = $this->handler->execute('UPDATE '.$this->options['table'].' SET data=\''.$data.'\' ,datacrc=\''.$crc.'\',expire='.$expire.' WHERE `cachekey`=\''.$name.'\'');
|
||||
}else {
|
||||
//新增记录
|
||||
$result = $this->handler->execute('INSERT INTO '.$this->options['table'].' (`cachekey`,`data`,`datacrc`,`expire`) VALUES (\''.$name.'\',\''.$data.'\',\''.$crc.'\','.$expire.')');
|
||||
}
|
||||
if($result) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
$name = $this->options['prefix'].addslashes($name);
|
||||
return $this->handler->execute('DELETE FROM `'.$this->options['table'].'` WHERE `cachekey`=\''.$name.'\'');
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return $this->handler->execute('TRUNCATE TABLE `'.$this->options['table'].'`');
|
||||
}
|
||||
|
||||
}
|
77
ThinkPHP/Library/Think/Cache/Driver/Eaccelerator.class.php
Executable file
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Eaccelerator缓存驱动
|
||||
*/
|
||||
class Eaccelerator extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
return eaccelerator_get($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
eaccelerator_lock($name);
|
||||
if(eaccelerator_put($name, $value, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return eaccelerator_rm($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
}
|
181
ThinkPHP/Library/Think/Cache/Driver/File.class.php
Executable file
@ -0,0 +1,181 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* 文件类型缓存类
|
||||
*/
|
||||
class File extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if(!empty($options)) {
|
||||
$this->options = $options;
|
||||
}
|
||||
$this->options['temp'] = !empty($options['temp'])? $options['temp'] : C('DATA_CACHE_PATH');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
if(substr($this->options['temp'], -1) != '/') $this->options['temp'] .= '/';
|
||||
$this->init();
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化检查
|
||||
* @access private
|
||||
* @return boolean
|
||||
*/
|
||||
private function init() {
|
||||
// 创建应用缓存目录
|
||||
if (!is_dir($this->options['temp'])) {
|
||||
mkdir($this->options['temp']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取得变量的存储文件名
|
||||
* @access private
|
||||
* @param string $name 缓存变量名
|
||||
* @return string
|
||||
*/
|
||||
private function filename($name) {
|
||||
$name = md5(C('DATA_CACHE_KEY').$name);
|
||||
if(C('DATA_CACHE_SUBDIR')) {
|
||||
// 使用子目录
|
||||
$dir ='';
|
||||
for($i=0;$i<C('DATA_PATH_LEVEL');$i++) {
|
||||
$dir .= $name{$i}.'/';
|
||||
}
|
||||
if(!is_dir($this->options['temp'].$dir)) {
|
||||
mkdir($this->options['temp'].$dir,0755,true);
|
||||
}
|
||||
$filename = $dir.$this->options['prefix'].$name.'.php';
|
||||
}else{
|
||||
$filename = $this->options['prefix'].$name.'.php';
|
||||
}
|
||||
return $this->options['temp'].$filename;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
$filename = $this->filename($name);
|
||||
if (!is_file($filename)) {
|
||||
return false;
|
||||
}
|
||||
N('cache_read',1);
|
||||
$content = file_get_contents($filename);
|
||||
if( false !== $content) {
|
||||
$expire = (int)substr($content,8, 12);
|
||||
if($expire != 0 && time() > filemtime($filename) + $expire) {
|
||||
//缓存过期删除缓存文件
|
||||
unlink($filename);
|
||||
return false;
|
||||
}
|
||||
if(C('DATA_CACHE_CHECK')) {//开启数据校验
|
||||
$check = substr($content,20, 32);
|
||||
$content = substr($content,52, -3);
|
||||
if($check != md5($content)) {//校验错误
|
||||
return false;
|
||||
}
|
||||
}else {
|
||||
$content = substr($content,20, -3);
|
||||
}
|
||||
if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//启用数据压缩
|
||||
$content = gzuncompress($content);
|
||||
}
|
||||
$content = unserialize($content);
|
||||
return $content;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param int $expire 有效时间 0为永久
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name,$value,$expire=null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$filename = $this->filename($name);
|
||||
$data = serialize($value);
|
||||
if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//数据压缩
|
||||
$data = gzcompress($data,3);
|
||||
}
|
||||
if(C('DATA_CACHE_CHECK')) {//开启数据校验
|
||||
$check = md5($data);
|
||||
}else {
|
||||
$check = '';
|
||||
}
|
||||
$data = "<?php\n//".sprintf('%012d',$expire).$check.$data."\n?>";
|
||||
$result = file_put_contents($filename,$data);
|
||||
if($result) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
clearstatcache();
|
||||
return true;
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return unlink($this->filename($name));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
$path = $this->options['temp'];
|
||||
$files = scandir($path);
|
||||
if($files){
|
||||
foreach($files as $file){
|
||||
if ($file != '.' && $file != '..' && is_dir($path.$file) ){
|
||||
array_map( 'unlink', glob( $path.$file.'/*.*' ) );
|
||||
}elseif(is_file($path.$file)){
|
||||
unlink( $path . $file );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
103
ThinkPHP/Library/Think/Cache/Driver/Memcache.class.php
Executable file
@ -0,0 +1,103 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Memcache缓存驱动
|
||||
*/
|
||||
class Memcache extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
function __construct($options=array()) {
|
||||
if ( !extension_loaded('memcache') ) {
|
||||
E(L('_NOT_SUPPORT_').':memcache');
|
||||
}
|
||||
|
||||
$options = array_merge(array (
|
||||
'host' => C('MEMCACHE_HOST') ? : '127.0.0.1',
|
||||
'port' => C('MEMCACHE_PORT') ? : 11211,
|
||||
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
|
||||
'persistent' => false,
|
||||
),$options);
|
||||
|
||||
$this->options = $options;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$func = $options['persistent'] ? 'pconnect' : 'connect';
|
||||
$this->handler = new \Memcache;
|
||||
$options['timeout'] === false ?
|
||||
$this->handler->$func($options['host'], $options['port']) :
|
||||
$this->handler->$func($options['host'], $options['port'], $options['timeout']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
return $this->handler->get($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if($this->handler->set($name, $value, 0, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name, $ttl = false) {
|
||||
$name = $this->options['prefix'].$name;
|
||||
return $ttl === false ?
|
||||
$this->handler->delete($name) :
|
||||
$this->handler->delete($name, $ttl);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return $this->handler->flush();
|
||||
}
|
||||
}
|
102
ThinkPHP/Library/Think/Cache/Driver/Memcached.class.php
Executable file
@ -0,0 +1,102 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2013 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: 何辉 <runphp@qq.com>
|
||||
// +----------------------------------------------------------------------
|
||||
|
||||
namespace Think\Cache\Driver;
|
||||
|
||||
use Memcached as MemcachedResource;
|
||||
use Think\Cache;
|
||||
|
||||
/**
|
||||
* Memcached缓存驱动
|
||||
*/
|
||||
class Memcached extends Cache {
|
||||
|
||||
/**
|
||||
*
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct($options = array()) {
|
||||
if ( !extension_loaded('memcached') ) {
|
||||
E(L('_NOT_SUPPORT_').':memcached');
|
||||
}
|
||||
|
||||
$options = array_merge(array(
|
||||
'servers' => C('MEMCACHED_SERVER') ? : null,
|
||||
'lib_options' => C('MEMCACHED_LIB') ? : null
|
||||
), $options);
|
||||
|
||||
$this->options = $options;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
|
||||
$this->handler = new MemcachedResource;
|
||||
$options['servers'] && $this->handler->addServers($options['servers']);
|
||||
$options['lib_options'] && $this->handler->setOptions($options['lib_options']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
return $this->handler->get($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if($this->handler->set($name, $value, time() + $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name, $ttl = false) {
|
||||
$name = $this->options['prefix'].$name;
|
||||
return $ttl === false ?
|
||||
$this->handler->delete($name) :
|
||||
$this->handler->delete($name, $ttl);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return $this->handler->flush();
|
||||
}
|
||||
}
|
144
ThinkPHP/Library/Think/Cache/Driver/Memcachesae.class.php
Executable file
@ -0,0 +1,144 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Memcache缓存驱动
|
||||
* @category Extend
|
||||
* @package Extend
|
||||
* @subpackage Driver.Cache
|
||||
* @author liu21st <liu21st@gmail.com>
|
||||
*/
|
||||
class Memcachesae extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
function __construct($options=array()) {
|
||||
$options = array_merge(array (
|
||||
'host' => C('MEMCACHE_HOST') ? : '127.0.0.1',
|
||||
'port' => C('MEMCACHE_PORT') ? : 11211,
|
||||
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
|
||||
'persistent' => false,
|
||||
),$options);
|
||||
|
||||
$this->options = $options;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->handler = memcache_init();//[sae] 下实例化
|
||||
//[sae] 下不用链接
|
||||
$this->connected=true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否连接
|
||||
* @access private
|
||||
* @return boolean
|
||||
*/
|
||||
private function isConnected() {
|
||||
return $this->connected;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
return $this->handler->get($_SERVER['HTTP_APPVERSION'].'/'.$this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if($this->handler->set($_SERVER['HTTP_APPVERSION'].'/'.$name, $value, 0, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name, $ttl = false) {
|
||||
$name = $_SERVER['HTTP_APPVERSION'].'/'.$this->options['prefix'].$name;
|
||||
return $ttl === false ?
|
||||
$this->handler->delete($name) :
|
||||
$this->handler->delete($name, $ttl);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return $this->handler->flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* 队列缓存
|
||||
* @access protected
|
||||
* @param string $key 队列名
|
||||
* @return mixed
|
||||
*/
|
||||
//[sae] 下重写queque队列缓存方法
|
||||
protected function queue($key) {
|
||||
$queue_name=isset($this->options['queue_name'])?$this->options['queue_name']:'think_queue';
|
||||
$value = F($queue_name);
|
||||
if(!$value) {
|
||||
$value = array();
|
||||
}
|
||||
// 进列
|
||||
if(false===array_search($key, $value)) array_push($value,$key);
|
||||
if(count($value) > $this->options['length']) {
|
||||
// 出列
|
||||
$key = array_shift($value);
|
||||
// 删除缓存
|
||||
$this->rm($key);
|
||||
if (APP_DEBUG) {
|
||||
//调试模式下记录出队次数
|
||||
$counter = Think::instance('SaeCounter');
|
||||
if ($counter->exists($queue_name.'_out_times'))
|
||||
$counter->incr($queue_name.'_out_times');
|
||||
else
|
||||
$counter->create($queue_name.'_out_times', 1);
|
||||
}
|
||||
}
|
||||
return F($queue_name,$value);
|
||||
}
|
||||
|
||||
}
|
107
ThinkPHP/Library/Think/Cache/Driver/Redis.class.php
Executable file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
|
||||
/**
|
||||
* Redis缓存驱动
|
||||
* 要求安装phpredis扩展:https://github.com/nicolasff/phpredis
|
||||
*/
|
||||
class Redis extends Cache {
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if ( !extension_loaded('redis') ) {
|
||||
E(L('_NOT_SUPPORT_').':redis');
|
||||
}
|
||||
$options = array_merge(array (
|
||||
'host' => C('REDIS_HOST') ? : '127.0.0.1',
|
||||
'port' => C('REDIS_PORT') ? : 6379,
|
||||
'timeout' => C('DATA_CACHE_TIMEOUT') ? : false,
|
||||
'persistent' => false,
|
||||
),$options);
|
||||
|
||||
$this->options = $options;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$func = $options['persistent'] ? 'pconnect' : 'connect';
|
||||
$this->handler = new \Redis;
|
||||
$options['timeout'] === false ?
|
||||
$this->handler->$func($options['host'], $options['port']) :
|
||||
$this->handler->$func($options['host'], $options['port'], $options['timeout']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
$value = $this->handler->get($this->options['prefix'].$name);
|
||||
$jsonData = json_decode( $value, true );
|
||||
return ($jsonData === NULL) ? $value : $jsonData; //检测是否为JSON数据 true 返回JSON解析数组, false返回源数据
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value, $expire = null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
//对数组/对象数据进行缓存处理,保证数据完整性
|
||||
$value = (is_object($value) || is_array($value)) ? json_encode($value) : $value;
|
||||
if(is_int($expire) && $expire) {
|
||||
$result = $this->handler->setex($name, $expire, $value);
|
||||
}else{
|
||||
$result = $this->handler->set($name, $value);
|
||||
}
|
||||
if($result && $this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return $this->handler->delete($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return $this->handler->flushDB();
|
||||
}
|
||||
|
||||
}
|
186
ThinkPHP/Library/Think/Cache/Driver/Shmop.class.php
Executable file
@ -0,0 +1,186 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Shmop缓存驱动
|
||||
*/
|
||||
class Shmop extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if ( !extension_loaded('shmop') ) {
|
||||
E(L('_NOT_SUPPORT_').':shmop');
|
||||
}
|
||||
if(!empty($options)){
|
||||
$options = array(
|
||||
'size' => C('SHARE_MEM_SIZE'),
|
||||
'temp' => TEMP_PATH,
|
||||
'project' => 's',
|
||||
'length' => 0,
|
||||
);
|
||||
}
|
||||
$this->options = $options;
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->handler = $this->_ftok($this->options['project']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name = false) {
|
||||
N('cache_read',1);
|
||||
$id = shmop_open($this->handler, 'c', 0600, 0);
|
||||
if ($id !== false) {
|
||||
$ret = unserialize(shmop_read($id, 0, shmop_size($id)));
|
||||
shmop_close($id);
|
||||
|
||||
if ($name === false) {
|
||||
return $ret;
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if(isset($ret[$name])) {
|
||||
$content = $ret[$name];
|
||||
if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//启用数据压缩
|
||||
$content = gzuncompress($content);
|
||||
}
|
||||
return $content;
|
||||
}else {
|
||||
return null;
|
||||
}
|
||||
}else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value) {
|
||||
N('cache_write',1);
|
||||
$lh = $this->_lock();
|
||||
$val = $this->get();
|
||||
if (!is_array($val)) $val = array();
|
||||
if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//数据压缩
|
||||
$value = gzcompress($value,3);
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
$val[$name] = $value;
|
||||
$val = serialize($val);
|
||||
if($this->_write($val, $lh)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
$lh = $this->_lock();
|
||||
$val = $this->get();
|
||||
if (!is_array($val)) $val = array();
|
||||
$name = $this->options['prefix'].$name;
|
||||
unset($val[$name]);
|
||||
$val = serialize($val);
|
||||
return $this->_write($val, $lh);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成IPC key
|
||||
* @access private
|
||||
* @param string $project 项目标识名
|
||||
* @return integer
|
||||
*/
|
||||
private function _ftok($project) {
|
||||
if (function_exists('ftok')) return ftok(__FILE__, $project);
|
||||
if(strtoupper(PHP_OS) == 'WINNT'){
|
||||
$s = stat(__FILE__);
|
||||
return sprintf("%u", (($s['ino'] & 0xffff) | (($s['dev'] & 0xff) << 16) |
|
||||
(($project & 0xff) << 24)));
|
||||
}else {
|
||||
$filename = __FILE__ . (string) $project;
|
||||
for($key = array(); sizeof($key) < strlen($filename); $key[] = ord(substr($filename, sizeof($key), 1)));
|
||||
return dechex(array_sum($key));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入操作
|
||||
* @access private
|
||||
* @param string $name 缓存变量名
|
||||
* @return integer|boolean
|
||||
*/
|
||||
private function _write(&$val, &$lh) {
|
||||
$id = shmop_open($this->handler, 'c', 0600, $this->options['size']);
|
||||
if ($id) {
|
||||
$ret = shmop_write($id, $val, 0) == strlen($val);
|
||||
shmop_close($id);
|
||||
$this->_unlock($lh);
|
||||
return $ret;
|
||||
}
|
||||
$this->_unlock($lh);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 共享锁定
|
||||
* @access private
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
private function _lock() {
|
||||
if (function_exists('sem_get')) {
|
||||
$fp = sem_get($this->handler, 1, 0600, 1);
|
||||
sem_acquire ($fp);
|
||||
} else {
|
||||
$fp = fopen($this->options['temp'].$this->options['prefix'].md5($this->handler), 'w');
|
||||
flock($fp, LOCK_EX);
|
||||
}
|
||||
return $fp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解除共享锁定
|
||||
* @access private
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
private function _unlock(&$fp) {
|
||||
if (function_exists('sem_release')) {
|
||||
sem_release($fp);
|
||||
} else {
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
}
|
119
ThinkPHP/Library/Think/Cache/Driver/Sqlite.class.php
Executable file
@ -0,0 +1,119 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Sqlite缓存驱动
|
||||
*/
|
||||
class Sqlite extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if ( !extension_loaded('sqlite') ) {
|
||||
E(L('_NOT_SUPPORT_').':sqlite');
|
||||
}
|
||||
if(empty($options)) {
|
||||
$options = array (
|
||||
'db' => ':memory:',
|
||||
'table' => 'sharedmemory',
|
||||
);
|
||||
}
|
||||
$this->options = $options;
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
|
||||
$func = $this->options['persistent'] ? 'sqlite_popen' : 'sqlite_open';
|
||||
$this->handler = $func($this->options['db']);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
$name = $this->options['prefix'].sqlite_escape_string($name);
|
||||
$sql = 'SELECT value FROM '.$this->options['table'].' WHERE var=\''.$name.'\' AND (expire=0 OR expire >'.time().') LIMIT 1';
|
||||
$result = sqlite_query($this->handler, $sql);
|
||||
if (sqlite_num_rows($result)) {
|
||||
$content = sqlite_fetch_single($result);
|
||||
if(C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//启用数据压缩
|
||||
$content = gzuncompress($content);
|
||||
}
|
||||
return unserialize($content);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value,$expire=null) {
|
||||
N('cache_write',1);
|
||||
$name = $this->options['prefix'].sqlite_escape_string($name);
|
||||
$value = sqlite_escape_string(serialize($value));
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$expire = ($expire==0)?0: (time()+$expire) ;//缓存有效期为0表示永久缓存
|
||||
if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
|
||||
//数据压缩
|
||||
$value = gzcompress($value,3);
|
||||
}
|
||||
$sql = 'REPLACE INTO '.$this->options['table'].' (var, value,expire) VALUES (\''.$name.'\', \''.$value.'\', \''.$expire.'\')';
|
||||
if(sqlite_query($this->handler, $sql)){
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
$name = $this->options['prefix'].sqlite_escape_string($name);
|
||||
$sql = 'DELETE FROM '.$this->options['table'].' WHERE var=\''.$name.'\'';
|
||||
sqlite_query($this->handler, $sql);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
$sql = 'DELETE FROM '.$this->options['table'];
|
||||
sqlite_query($this->handler, $sql);
|
||||
return ;
|
||||
}
|
||||
}
|
88
ThinkPHP/Library/Think/Cache/Driver/Wincache.class.php
Executable file
@ -0,0 +1,88 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Wincache缓存驱动
|
||||
*/
|
||||
class Wincache extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if ( !function_exists('wincache_ucache_info') ) {
|
||||
E(L('_NOT_SUPPORT_').':WinCache');
|
||||
}
|
||||
$this->options['expire'] = isset($options['expire'])? $options['expire'] : C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])? $options['prefix'] : C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])? $options['length'] : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
$name = $this->options['prefix'].$name;
|
||||
return wincache_ucache_exists($name)? wincache_ucache_get($name) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value,$expire=null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'];
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if(wincache_ucache_set($name, $value, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return wincache_ucache_delete($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return wincache_ucache_clear();
|
||||
}
|
||||
|
||||
}
|
90
ThinkPHP/Library/Think/Cache/Driver/Xcache.class.php
Executable file
@ -0,0 +1,90 @@
|
||||
<?php
|
||||
// +----------------------------------------------------------------------
|
||||
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
|
||||
// +----------------------------------------------------------------------
|
||||
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
|
||||
// +----------------------------------------------------------------------
|
||||
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
// +----------------------------------------------------------------------
|
||||
// | Author: liu21st <liu21st@gmail.com>
|
||||
// +----------------------------------------------------------------------
|
||||
namespace Think\Cache\Driver;
|
||||
use Think\Cache;
|
||||
defined('THINK_PATH') or exit();
|
||||
/**
|
||||
* Xcache缓存驱动
|
||||
*/
|
||||
class Xcache extends Cache {
|
||||
|
||||
/**
|
||||
* 架构函数
|
||||
* @param array $options 缓存参数
|
||||
* @access public
|
||||
*/
|
||||
public function __construct($options=array()) {
|
||||
if ( !function_exists('xcache_info') ) {
|
||||
E(L('_NOT_SUPPORT_').':Xcache');
|
||||
}
|
||||
$this->options['expire'] = isset($options['expire'])?$options['expire']:C('DATA_CACHE_TIME');
|
||||
$this->options['prefix'] = isset($options['prefix'])?$options['prefix']:C('DATA_CACHE_PREFIX');
|
||||
$this->options['length'] = isset($options['length'])?$options['length']:0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($name) {
|
||||
N('cache_read',1);
|
||||
$name = $this->options['prefix'].$name;
|
||||
if (xcache_isset($name)) {
|
||||
return xcache_get($name);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @param mixed $value 存储数据
|
||||
* @param integer $expire 有效时间(秒)
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($name, $value,$expire=null) {
|
||||
N('cache_write',1);
|
||||
if(is_null($expire)) {
|
||||
$expire = $this->options['expire'] ;
|
||||
}
|
||||
$name = $this->options['prefix'].$name;
|
||||
if(xcache_set($name, $value, $expire)) {
|
||||
if($this->options['length']>0) {
|
||||
// 记录缓存队列
|
||||
$this->queue($name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除缓存
|
||||
* @access public
|
||||
* @param string $name 缓存变量名
|
||||
* @return boolean
|
||||
*/
|
||||
public function rm($name) {
|
||||
return xcache_unset($this->options['prefix'].$name);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
* @access public
|
||||
* @return boolean
|
||||
*/
|
||||
public function clear() {
|
||||
return xcache_clear_cache(1, -1);
|
||||
}
|
||||
}
|
@ -1 +0,0 @@
|
||||
|