0

PHPのキャッシュに関する情報を探しています。私が見つけたすべての情報は、特定の時間間隔で(数時間ごとに)phpファイルをキャッシュすることです。50 ページ ビューごとにキャッシュする方法はありますか? 50 ページ ビューごとに、キャッシュされたファイルの有効期限が切れます。

誰でもこれについて何か考えがありますか?

前もって感謝します!

4

2 に答える 2

1

ファイルベースのキャッシュを使用する代わりに、データベース、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;
}

?>
于 2012-05-26T12:07:28.893 に答える
0

これに対する解決策を得るために、非常にローテクになる可能性があります。

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、フォルダは空になり、キャッシュされたデータが更新されます。

于 2012-05-26T11:48:59.450 に答える