<?php
|
/**
|
* PhalApi_Cache_File 文件缓存
|
*
|
* @package PhalApi\Cache
|
* @license http://www.phalapi.net/license GPL 协议
|
* @link http://www.phalapi.net/
|
* @author dogstar <chanzonghuang@gmail.com> 2015-02-26
|
*/
|
|
class PhalApi_Cache_File implements PhalApi_Cache {
|
|
protected $folder;
|
|
protected $prefix;
|
|
public function __construct($config) {
|
$this->folder = rtrim($config['path'], '/');
|
|
$cacheFolder = $this->createCacheFileFolder();
|
|
if (!is_dir($cacheFolder)) {
|
mkdir($cacheFolder, 0777, TRUE);
|
}
|
|
$this->prefix = isset($config['prefix']) ? $config['prefix'] : 'phapapi';
|
}
|
|
public function set($key, $value, $expire = 600) {
|
if ($key === NULL || $key === '') {
|
return;
|
}
|
|
$filePath = $this->createCacheFilePath($key);
|
|
$expireStr = sprintf('%010d', $expire + time());
|
if (strlen($expireStr) > 10) {
|
throw new PhalApi_Exception_InternalServerError(
|
T('file expire is too large')
|
);
|
}
|
|
if (!file_exists($filePath)) {
|
touch($filePath);
|
chmod($filePath, 0777);
|
}
|
file_put_contents($filePath, $expireStr . serialize($value));
|
}
|
|
public function get($key) {
|
$filePath = $this->createCacheFilePath($key);
|
|
if (file_exists($filePath)) {
|
$expireTime = file_get_contents($filePath, FALSE, NULL, 0, 10);
|
|
if ($expireTime > time()) {
|
return @unserialize(file_get_contents($filePath, FALSE, NULL, 10));
|
}
|
}
|
|
return NULL;
|
}
|
|
public function delete($key) {
|
if ($key === NULL || $key === '') {
|
return;
|
}
|
|
$filePath = $this->createCacheFilePath($key);
|
|
@unlink($filePath);
|
}
|
|
/**
|
* 考虑到Linux同一目录下的文件个数限制,这里拆分成1000个文件缓存目录
|
*/
|
protected function createCacheFilePath($key) {
|
$folderSufix = sprintf('%03d', hexdec(substr(sha1($key), -5)) % 1000);
|
$cacheFolder = $this->createCacheFileFolder() . DIRECTORY_SEPARATOR . $folderSufix;
|
if (!is_dir($cacheFolder)) {
|
mkdir($cacheFolder, 0777, TRUE);
|
}
|
|
return $cacheFolder . DIRECTORY_SEPARATOR . md5($key) . '.dat';
|
}
|
|
protected function createCacheFileFolder() {
|
return $this->folder . DIRECTORY_SEPARATOR . 'cache';
|
}
|
}
|