##方案二:讀取緩存方式開發首頁接口
流程:從數據庫獲取信息 -> 封裝(讀取緩存,再次讀取) -> 返回數據
用途:減少數據庫壓力
學習要點:
1. 掌握靜態緩存如何設置緩存失效時間;
2. 如何設置緩存;
詳細流程:

*文件連接:var/www/app/list.php*
~~~
<?php
// 假設分頁參數 http://192.168.2.110/app/list.php
require_once('./response.php');
require_once('./db.php');
require_once('./file.php');
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$pageSize = isset($_GET['pagesize']) ? $_GET['pagesize'] : 1;
if (!is_numeric($page) || !is_numeric($pageSize)) {
return Response::show(401, '數據不合法');
}
$offset = ($page-1) * $pageSize;
$sql = "select * from mk_user where score != 0 order by id desc limit " . $offset . "," . $pageSize;
// 判斷是否有緩存存在
$cache = new File();
$users = array();
// 如果存在緩存,則直接獲取緩存
if (!$users = $cache->cacheData('index_mk_cache' . $page . '-' . $pageSize)) {
try {
$connect = Db::getInstance()->connect();
} catch(Exception $e) {
return Response::show(403, '數據庫連接失敗', $users);
}
$result = mysql_query($sql, $connect);
$users = array();
while ($user = mysql_fetch_assoc($result)) {
$users[] = $user;
}
if($users) {
$cache->cacheData('index_mk_cache' . $page . '-' . $pageSize, $users, 1200);
}
}
if($users) {
return Response::show(200, '首頁數據獲取成功', $users);
} else {
return Response::show(400, '首頁數據獲取失敗', $users);
}
~~~
*重新定義一下緩存文件類,把緩存路徑改為緩存失效時間:var/www/app/file.php*
~~~
class File {
private $_dir; // 默認路徑
const EXT = '.txt';
public function __construct() {
// dirname() 當前文件目錄
$this->_dir = dirname(__FILE__) . '/files/'; //默認路徑為當前文件下的files下
}
/**
* [cacheData description]
* @Author ZJC
* @DateTime 2017-02-15T10:31:38+0800
* @param [type] $key [緩存文件文件名]
* @param string $value [緩存數據]
* @param integer $cacheTime [緩存失效時間]
* @return [type] [description]
*/
public function cacheData($key, $value = '', $cacheTime = 0) {
$filename = $this->_dir .$key . self::EXT;
if ($value !== '') { // 將value值寫入緩存
if(is_null($value)) {
return @unlink($filename);
}
// 判斷是否存在文件目錄,如果不存在,則創建
$dir = dirname($filename);
if (!is_dir($dir)) {
mkdir($dir, 0777);
}
$cacheTime = sprintf('%011d', $cacheTime);
// file_put_contents:將一個字符串寫入文件
// int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )
// $data部分最好為字符串形式,因為不支持多維數組;(序列化,JSON都可以)
return file_put_contents($filename, $cacheTime . json_encode($value)); // c成功返回字節數,失敗返回FALSE
}
if(!is_file($filename)) { // 顯示緩存
return FALSE;
}
$contents = file_get_contents($filename);
$cacheTime = (int)substr($contents, 0, 11);
$value = substr($contents, 11);
if($cacheTime != 0 && $cacheTime + filemtime($filename) < time()) {
unlink($filename);
return FALSE;
}
return json_decode($value, true);
}
}
~~~