PHPのキャッシュに関する情報を探しています。私が見つけたすべての情報は、特定の時間間隔で(数時間ごとに)phpファイルをキャッシュすることです。50 ページ ビューごとにキャッシュする方法はありますか? 50 ページ ビューごとに、キャッシュされたファイルの有効期限が切れます。
誰でもこれについて何か考えがありますか?
前もって感謝します!
ファイルベースのキャッシュを使用する代わりに、データベース、PDO sqlite を使用する (この方法では、キャッシュ ファイル データベースを削除してすべてのキャッシュをクリアするだけで簡単です)。
下の方を見ると、どのように機能するかがわかります。50 回ヒットすると行が削除され、新しいコピーを生成できるようにリダイレクトされます。それが役に立てば幸い
sqlite.cache.class.php
<?php
/**
* PDO sqlite cache class
* You can include('sqlite.cache.class.php'); this class
*/
class sqlite_cache{
private $db;
function __construct($dsn){
$this->dsn = $dsn;
$this->chkSetup();
}
/*Singleton Connect*/
private function connect(){
if (!$this->db instanceof PDO){
$this->db = new PDO($this->dsn);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
/*Raw Select*/
public function rawSelect($sql){
$this->connect();
return $this->db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
public function get($fieldname=null, $id=null){
$this->connect();
$sql = "SELECT * FROM cache WHERE $fieldname = :id";
$statement = $this->db->prepare($sql);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->execute();
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
/*Insert*/
public function put($values){
$this->connect();
$fieldnames = array_keys($values[0]);
$sql = "INSERT INTO cache ";
$fields = '('.implode(' ,', $fieldnames).')';
$bound = '(:'.implode(', :', $fieldnames).')';
$sql .= $fields.' VALUES '.$bound;
$statement = $this->db->prepare($sql);
foreach($values as $vals){
$statement->execute($vals);
}
}
/*Update*/
public function update($fieldname, $value, $pk, $id){
$this->connect();
$sql = "UPDATE cache SET $fieldname = :value WHERE $pk = :id";
$statement = $this->db->prepare($sql);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->bindParam(':value', $value, PDO::PARAM_STR);
$statement->execute();
}
/*Update Hits*/
public function add_hit($id){
$this->connect();
$sql = "UPDATE cache SET hits = hits + 1 WHERE url = :id";
$statement = $this->db->prepare($sql);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->execute();
}
/*Delete*/
public function delete($id){
$this->connect();
$sql = "DELETE FROM cache WHERE url = :id";
$statement = $this->db->prepare($sql);
$statement->bindParam(':id', $id, PDO::PARAM_STR);
$statement->execute();
}
/*Database Setup*/
private function chkSetup(){
$dso = explode(':',$this->dsn);
if(file_exists($dso[1])){
return;
}else{
$this->connect();
//Create Table
$sql ="CREATE TABLE cache (id INTEGER PRIMARY KEY,
title TEXT,
url TEXT,
hits INTEGER,
date INTEGER,
contents TEXT)";
$this->db->query($sql);
header("refresh:0;url=./");
die;
}
}
}
?>
index.php
<?php
include('sqlite.cache.class.php');
$cache = new sqlite_cache('sqlite:./cache.db');
//Check if cache exists
$cache_result = $cache->get('url',$_SERVER['REQUEST_URI']);
//Exists
if(!empty($cache_result)){
//Add Hit
$cache->add_hit($_SERVER['REQUEST_URI']);
//Delete If over 50 hits
if($cache_result[0]['hits']>=50){
$cache->delete($_SERVER['REQUEST_URI']);
header('Location: '.$_SERVER['REQUEST_URI']);
die;
}
echo $cache_result[0]['contents'];
}else{
//Generate your page contents ect
ob_start();
///////////////////////////////
//Your script code goes here
///////////////////////////////
echo 'Your content';
//End your script code/////////
///////////////////////////////
$return = ob_get_contents();
ob_end_clean();
//Before output build values to put in cache
$cache_contents = array(array('id'=>NULL,
'title'=>'Page Title',
'url'=>$_SERVER['REQUEST_URI'],
'hits'=>'0',
'date'=>time(),
'contents'=>$return));
//Store cache
$cache->put($cache_contents);
echo $return;
}
?>
これに対する解決策を得るために、非常にローテクになる可能性があります。
URL へのヒットごとに、カウンタとして一時ファイルを作成できます。このようなものを使用して -
// recursively remove a directory
function rrmdir($dir) {
foreach(glob($dir . '/*') as $file) {
if ($file != "." && $file != "..") {
if(is_dir($file))
rrmdir($file);
else
unlink($file);
}
}
rmdir($dir);
}
$fileCount = count(glob($tempfile_directory."/*"));
if ($fileCount >= $someLimit){
rrmdir($tempfile_directory); // clear the counter
mkdir($tempfile_directory);
// clear the cached server data and refresh.
}
touch($tempfile_directory . '/' . time()); // create a new dummy counter file
から借用した再帰的な削除関数 - http://www.php.net/manual/en/function.rmdir.php#108113
のファイル数が$tempfile_directory
以上の場合$someLimit
、フォルダは空になり、キャッシュされたデータが更新されます。