php高效下载文件,LinkCache
LinkCache - 一個靈活高效的PHP緩存工具庫
LinkCache 是一個PHP編寫的靈活高效的緩存工具庫,提供多種緩存驅動支持,包括Memcache、Memcached、Redis、SSDB、文件緩存、APC、YAC等。通過LinkCache可以使不同緩存驅動實現操作統一,同時又可發揮不同緩存驅動各自的優勢。LinkCache支持緩存 object 和 array,同時為防止產生驚群現象做了優化。
環境要求
PHP >= 5.4
使用 Memcache 緩存需要安裝Memcache擴展
使用 Memcached 緩存需要安裝Memcached擴展
使用 Redis 緩存需要安裝Redis擴展
使用 APC 緩存需要安裝APC擴展
使用 YAC 緩存需要安裝YAC擴展
安裝
composer 安裝
LinkCache 可以通過 composer 安裝,使用以下命令從 composer 下載安裝 LinkCache
$composer require dongnan/linkcache
手動下載安裝
下載地址
安裝方法
在你的入口文件中引入
//引入 LinkCache 的自動加載文件
include("path_to_linkcache/autoload.php");
如何使用
config - 配置信息
getDriver - 獲取緩存驅動實例
set - 將參數中的 value設置為 key 的值
setnx - 當緩存中不存在 key 時,將參數中的 value 設置為 key 的值
get - 獲取 key 對應的值
del - 刪除 key
has - 判斷 key 是否存在
ttl - 獲取 key 的生存時間(單位:s)
expire - 設置一個 key 的生存時間(單位:s)
expireAt - 用UNIX時間戳設置一個 key 的過期時間
persist - 刪除一個 key 的生存時間,使其永不過期
lock - 對 key 設置鎖標記(此鎖并不對 key 做修改限制,僅為 key 的鎖標記)
isLock - 判斷 key 是否有鎖標記
unLock - 移除 key 的鎖標記
incr - 設置 key 的值按整數遞增
incrByFloat - 設置 key 的值按浮點數遞增
decr - 設置 key 的值按整數遞減
mSet - 批量設置多個 key 對應的值
mSetNX - 當緩存中不存在 key 時,批量設置多個 key 對應的值
mGet - 獲取所有給定 key 的值
mHas - 批量判斷 key 是否存在
mDel - 批量刪除 key
config
配置信息
//設置緩存配置, 使用 array_merge 的方式合并到默認配置中
\linkcache\Cache::setConfig($config);
//獲取配置信息
$congig = \linkcache\Cache::getConfig();
//獲取指定緩存驅動的配置信息
$congig = \linkcache\Cache::getConfig('redis');
//默認配置信息
[
//默認使用的緩存驅動
'default' => 'files',
//當前緩存驅動失效時,使用的備份驅動
'fallback' => 'files',
'memcache' => [
'servers' => [
['host' => '127.0.0.1', 'port' => 11211, 'weight' => 1, 'persistent' => true, 'timeout' => 1, 'retry_interval' => 15, 'status' => true],
],
'compress' => ['threshold' => 2000, 'min_saving' => 0.2],
],
'memcached' => [
'servers' => [
['host' => '127.0.0.1', 'port' => 11211, 'weight' => 1],
],
//參考 Memcached::setOptions
'options' => [],
],
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'database' => '',
'timeout' => ''
],
'ssdb' => [
'host' => '127.0.0.1',
'port' => 8888,
'password' => '',
'timeoutms' => ''
],
]
instance
實例化緩存對象
//直接new一個
$cache = new \linkcache\Cache();
//通過getInstance獲取
$cache = \linkcache\Cache::getInstance();
//根據驅動類型實例化,支持的驅動:redis,memcache,memcached,ssdb,files,apc,yac
$cache = new \linkcache\Cache('files');
//或者
$cache = \linkcache\Cache::getInstance('files');
//傳入配置參數實例化
$cache = new \linkcache\Cache('redis', ['host' => '127.0.0.1', 'port' => 6379]);
getDriver
獲取緩存驅動實例
所有緩存驅動都必須實現 linkcache\interfaces\driver\Base 接口的方法,獲取到緩存驅動實例后,可直接使用緩存驅動的方法,包括緩存驅動中沒有定義但緩存驅動擴展對象中已定義的方法。
set
將參數中的 value 設置為 key 的值
參數
key - 字符串
value- 除了 resource 類型的所有的值
time - (可選參數) key的生存時間,單位是秒(s)
返回值
Boolean 如果設置成功,返回 true; 如果設置失敗,返回 false
例子
//設置不過期的緩存
$status = $cache->set($key, $value);
//設置有過期時間的緩存
$status = $cache->set($key, $value, $time);
setnx
當緩存中不存在 key 時,將參數中的 value 設置為 key 的值
參數
key - 字符串
value- 除了 resource 類型的所有的值
time - (可選參數) key的生存時間,單位是秒(s)
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗,返回 false
例子
//設置不過期的緩存
$status = $cache->setnx($key, $value);
//設置有過期時間的緩存
$status = $cache->setnx($key, $value, $time);
get
獲取 key 對應的值
參數
key - 字符串
返回值
Mixed - key 對應的值; 如果獲取失敗或 key 不存在,返回 false
例子
//獲取key對應的值
$value = $cache->get($key);
del
刪除 key
參數
key - 字符串
返回值
Boolean - 如果刪除成功,返回 true; 如果刪除失敗,返回 false。注意: 當 key 不存在時,也會返回 true
例子
//刪除key
$status = $cache->del($key);
has
判斷 key 是否存在
參數
key - 字符串
返回值
Boolean - 如果 key 存在,返回 true;如果 key 不存在,返回 false
例子
//判斷key是否存在
$status = $cache->has($key);
ttl
獲取 key 的生存時間(單位:s)
參數
key - 字符串
返回值
Mixed - 生存剩余時間(單位:秒) -1 表示永不過期,-2 表示 key 不存在,失敗返回 false
例子
//獲取key的生存時間
$ttl = $cache->ttl($key);
expire
設置一個 key 的生存時間(單位:s)
參數
key - 字符串
time - 整數,key的生存時間(單位:s)
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗或 key 不存在,返回 false
例子
//設置一個key的生存時間
$status = $cache->expire($key, $time);
expireAt
用UNIX時間戳設置一個 key 的過期時間
參數
key - 字符串
time - UNIX時間戳(單位:s)
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗或 key 不存在,返回 false
例子
//用UNIX時間戳設置一個key的過期時間
$status = $cache->expireAt($key, $time);
persist
刪除一個 key 的生存時間,使其永不過期
參數
key - 字符串
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗或 key 不存在,返回 false
例子
//刪除一個key的生存時間,使其永不過期
$status = $cache->persist($key);
lock
對 key 設置鎖標記(此鎖并不對 key 做修改限制,僅為 key 的鎖標記)
參數
key - 字符串
time - 整數,key鎖標記 的生存時間(單位:s)
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗,返回 false
例子
//對key設置鎖標記
$status = $cache->lock($key, $time);
isLock
判斷 key 是否有鎖標記
參數
key - 字符串
返回值
Boolean - 如果有鎖標記,返回 true; 如果沒有鎖標記或判斷失敗,返回 false
例子
//判斷key是否有鎖標記
$status = $cache->isLock($key);
unLock
移除 key 的鎖標記
參數
key - 字符串
返回值
Boolean - 如果移除成功,返回 true; 如果失敗,返回 false
例子
//移除key的鎖標記
$status = $cache->unLock($key);
incr
設置 key 的值按整數遞增
參數
key - 字符串
step - (可選參數) 整數,遞增步長,默認值為 1,可以為負值
返回值
Mixed - 遞增后的值,失敗返回 false,如果 key 不存在,則按 step 設置新值
例子
//設置key的值按整數遞增
$value = $cache->incr($key, $step);
incrByFloat
設置 key 的值按浮點數遞增
參數
key - 字符串
float - 浮點數,遞增步長,可以為負值
返回值
Mixed - 遞增后的值,失敗返回 false,如果 key 不存在,則按 float 設置新值
例子
//設置key的值按浮點數遞增
$value = $cache->incrByFloat($key, $float);
decr
設置 key 的值按整數遞減
參數
key - 字符串
step - (可選參數) 整數,遞減步長,默認值為 1,可以為負值
返回值
Mixed - 遞減后的值,失敗返回 false,如果 key 不存在,則按 -step 設置新值
例子
//設置key的值按整數遞減
$value = $cache->decr($key, $step);
mSet
批量設置多個 key 對應的值
參數
sets - key 和 value 組成的鍵值對數組
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗,返回 false
例子
$sets = [
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3',
];
//批量設置多個key對應的值
$status = $cache->mSet($sets);
mSetNX
當緩存中不存在 key 時,批量設置多個 key 對應的值
參數
sets - key 和 value 組成的鍵值對數組
返回值
Boolean - 如果設置成功,返回 true; 如果設置失敗,返回 false
例子
$sets = [
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3',
];
//當緩存中不存在key時,批量設置多個key對應的值
$status = $cache->mSetNX($sets);
mGet
獲取所有給定 key 的值
參數
keys - 多個 key 組成的數組
返回值
array - 參數 keys 中的所有 key 與對應的 value 組成的數組,如果 key 不存在或是獲取失敗,對應的 value 值為 false
例子
$keys = ['key1', 'key2', 'key3'];
//獲取所有給定key的值
$status = $cache->mGet($keys);
mHas
批量判斷 key 是否存在
參數
keys - 多個 key 組成的數組
返回值
array - 返回存在的 key 的數組,如果判斷失敗返回 false
例子
$keys = ['key1', 'key2', 'key3'];
//批量判斷key是否存在
$hasKeys = $cache->mHas($keys);
mDel
批量刪除 key
參數
keys - 多個 key 組成的數組
返回值
Boolean - 如果刪除成功,返回 true; 如果刪除失敗,返回 false
例子
$keys = ['key1', 'key2', 'key3'];
//批量刪除key
$status = $cache->mDel($keys);
默認情況說明
Cache - \linkcache\Cache
drivers
files - \linkcache\drivers\Files
memcache - \linkcache\drivers\Memcache
memcached - \linkcache\drivers\Memcached
redis - \linkcache\drivers\Redis
ssdb - \linkcache\drivers\Ssdb
apc - \linkcache\drivers\Apc
yac - \linkcache\drivers\Yac
cache
默認使用的緩存驅動: files
默認使用的備用驅動: files
memcache、redis、ssdb 等緩存驅動的默認配置均參考官方默認配置
自定義配置支持非驅動類型的key,但配置信息中需要有 driver_type 屬性,否則會拋異常
例如:
use \linkcache\Cache;
$config = [
'redis_m_db_1' => [
'driver_type' => 'redis',
'host' => '127.0.0.1',
'port' => 6380,
'database' => 1
],
'redis_m_db_2' => [
'driver_type' => 'redis',
'host' => '127.0.0.1',
'port' => 6380,
'database' => 2
],
'redis_s_db' => [
'driver_type' => 'redis',
'host' => '127.0.0.1',
'port' => 6381
]
];
Cache::setConfig($config);
//根據自定義配置實例化
$redisM1 = new Cache('redis_m_db_1');
$redisM2 = new Cache('redis_m_db_2');
$redisS0 = new Cache('redis_s_db');
drivers
所有驅動默認使用備用緩存
備用緩存優先使用實例化時構造函數傳入的配置 config 中的 fallback 定義,如果沒有定義,則使用 \linkcache\Cache::$config 中的 fallback 定義
files
默認保存路徑:優先使用上傳文件臨時目錄,未定義則使用系統臨時目錄,并在目錄下創建linkcache目錄,作為 files 驅動的默認保存路徑,代碼如下:
(ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir()) . '/linkcache'
memcache
當 memcache 連接斷開后,最大重連次數為3次,重新建立連接后,連接重試次數清零
memcached
當 memcached 連接斷開后,最大重連次數為3次,重新建立連接后,連接重試次數清零
redis
當 redis 連接斷開后,最大重連次數為3次,重新建立連接后,連接重試次數清零
ssdb
當 ssdb 連接斷開后,最大重連次數為3次,重新建立連接后,連接重試次數清零
apc
無
yac
可自定義緩存 key 前綴,默認無 key 前綴
開發
如果你覺得LinkCache還不錯,但又不支持你想用的緩存驅動,不妨嘗試在LinkCache新增該緩存驅動的支持。
1.增加新的緩存驅動
目前有兩種方式可以方便的開發新的緩存驅動支持
繼承 linkcache\abstracts\DriverSimple 抽象類
在 src/linkcache/drivers 目錄下創建新的緩存驅動類 Example.php
/**
* linkcache - 一個靈活高效的PHP緩存工具庫
*
* @author Dong Nan
* @copyright (c) Dong Nan http://idongnan.cn All rights reserved.
* @link http://git.oschina.net/dongnan/LinkCache
* @license BSD (http://opensource.org/licenses/BSD-3-Clause)
*/
namespace linkcache\drivers;
use linkcache\abstracts\DriverSimple;
class Example extends DriverSimple {
/**
* 構造函數
* @param array $config 配置
*/
public function __construct($config = []) {
$this->init($config);
//TODO 完善這個方法
}
/**
* 檢查驅動是否可用
* @return boolean 是否可用
*/
public function checkDriver() {
//TODO 實現這個方法
}
/**
* 設置鍵值
* @param string $key
* @param string $value
* @return boolean
*/
protected function setOne($key, $value) {
//TODO 實現這個方法
}
/**
* 獲取鍵值
* @param string $key
* @return mixed
*/
protected function getOne($key) {
//TODO 實現這個方法
}
/**
* 刪除鍵值
* @param string $key
* @return boolean
*/
protected function delOne($key) {
//TODO 實現這個方法
}
}
實現 linkcache\abstracts\DriverSimple 抽象類中的抽象方法
實現接口 linkcache\interfaces\driver\Base (Base接口是必須的,你也可以實現更多的接口:Incr,Lock,Multi)
在 src/linkcache/drivers 目錄下創建新的緩存驅動類 Example.php
/**
* linkcache - 一個靈活高效的PHP緩存工具庫
*
* @author Dong Nan
* @copyright (c) Dong Nan http://idongnan.cn All rights reserved.
* @link http://git.oschina.net/dongnan/LinkCache
* @license BSD (http://opensource.org/licenses/BSD-3-Clause)
*/
namespace linkcache\drivers;
use linkcache\interfaces\driver\Base;
class Example implements Base {
use \linkcache\traits\CacheDriver;
/**
* 構造函數
* @param array $config 配置
*/
public function __construct($config = []) {
$this->init($config);
//TODO 完善這個方法
}
/**
* 檢查驅動是否可用
* @return boolean 是否可用
*/
public function checkDriver() {
//TODO 實現這個方法
}
/**
* 設置鍵值
* @param string $key 鍵名
* @param mixed $value 鍵值
* @param int $time 過期時間,默認為-1,不設置過期時間;為0則設置為永不過期
* @return boolean 是否成功
*/
public function set($key, $value, $time = -1) {
//TODO 實現這個方法
}
/**
* 當鍵名不存在時設置鍵值
* @param string $key 鍵名
* @param mixed $value 鍵值
* @param int $time 過期時間,默認為-1,不設置過期時間;為0則設置為永不過期
* @return boolean 是否成功
*/
public function setnx($key, $value, $time = -1) {
//TODO 實現這個方法
}
/**
* 獲取鍵值
* @param string $key 鍵名
* @return mixed|false 鍵值,失敗返回false
*/
public function get($key) {
//TODO 實現這個方法
}
/**
* 刪除鍵值
* @param string $key 鍵名
* @return boolean 是否成功
*/
public function del($key) {
//TODO 實現這個方法
}
/**
* 是否存在鍵值
* @param string $key 鍵名
* @return boolean 是否存在
*/
public function has($key) {
//TODO 實現這個方法
}
/**
* 獲取生存剩余時間
* @param string $key 鍵名
* @return int|false 生存剩余時間(單位:秒) -1表示永不過期,-2表示鍵值不存在,失敗返回false
*/
public function ttl($key) {
//TODO 實現這個方法
}
/**
* 設置過期時間
* @param string $key 鍵名
* @param int $time 過期時間(單位:秒)。不大于0,則設為永不過期
* @return boolean 是否成功
*/
public function expire($key, $time) {
//TODO 實現這個方法
}
/**
* 移除指定鍵值的過期時間
* @param string $key 鍵名
* @return boolean 是否成功
*/
public function persist($key) {
//TODO 實現這個方法
}
}
實現 linkcache\interfaces\driver\Base 接口中的方法
2.測試新增的驅動
為了保證代碼的可靠性,不妨對新增的驅動做個測試吧。
我使用的是PHPUnit做的測試,版本:4.8.15
測試步驟
在 tests 目錄新增測試類 TestDriverExample.php
/**
* linkcache - 一個靈活高效的PHP緩存工具庫
*
* @author Dong Nan
* @copyright (c) Dong Nan http://idongnan.cn All rights reserved.
* @link http://git.oschina.net/dongnan/LinkCache
* @license BSD (http://opensource.org/licenses/BSD-3-Clause)
*/
namespace linkcacheTests;
/**
* TestDriverExample
*/
class TestDriverExample extends TestDriverFiles
{
protected $cacheDriver = 'example';
}
進入LinkCache項目目錄,執行測試命令
phpunit --bootstrap autoload_dev.php tests/TestDriverExample
顯示以下信息測試就通過啦~
PHPUnit 4.8.15 by Sebastian Bergmann and contributors.
....................
Time: 3.24 seconds, Memory: 8.50Mb
OK (20 tests, 74 assertions)
LICENSE
總結
以上是生活随笔為你收集整理的php高效下载文件,LinkCache的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 20小时内,mysql中关于
- 下一篇: php输出图片没有,ThinkPHP里无