2
<?php
// cache - will work online - not locally
// location and prefix for cache files
define('CACHE_PATH', "siteCache/"); 

// how long to keep the cache files (hours)
define('CACHE_TIME', 12); 
// return location and name for cache file 
function cache_file() 
{ 
    return CACHE_PATH . md5($_SERVER['REQUEST_URI']); 
}

// display cached file if present and not expired 
function cache_display() 
{ 
    $file = cache_file(); 
    // check that cache file exists and is not too old 
    if(!file_exists($file)) return; 
    if(filemtime($file) < time() - CACHE_TIME * 3600) return; 
    // if so, display cache file and stop processing
    readfile($file);
    exit; 
} 

// write to cache file 
function cache_page($content) 
{ 
    if(false !== ($f = @fopen(cache_file(), 'w'))) { 
        fwrite($f, $content);
        fclose($f); 
    } 
    return $content; 
} 

// execution stops here if valid cache file found
cache_display(); 

// enable output buffering and create cache file 
ob_start('cache_page');
?>

これは、db ファイルの動的 Web サイトで使用しているキャッシュ コードです。そして、すべてのページの上部にこのコードが含まれています。

<?php session_start();
include("db.php"); ?>

ページはキャッシュされており、機能していますが、フォームの送信時、ユーザーのログイン時、ページを通過する変数では何も起こりません。古いページが表示されています。このキャッシュ コードを使用して、サイトが機能し続けるようにするにはどうすればよいですか。

ワードプレスのプラグインがどのようにそれを行うのだろうか。Wp Super Cache と W3T Cache はすべてをキャッシュしますが、ブログは引き続き機能します。ウェブサイトの一部で選択的に使用する必要がありますか。

このような:

<?php
// TOP of your script
$cachefile = 'cache/'.basename($_SERVER['SCRIPT_URI']);
$cachetime = 120 * 60; // 2 hours

// Serve from the cache if it is younger than $cachetime
if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) {
    include($cachefile);
    echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." -->";
    exit;
}

ob_start(); // start the output buffer
// Your normal PHP script and HTML content here
// BOTTOM of your script
$fp = fopen($cachefile, 'w'); // open the cache file for writing
fwrite($fp, ob_get_contents()); // save the contents of output buffer to the file
fclose($fp); // close the file
ob_end_flush(); // Send the output to the browser
?>

ただし、ページからの選択的なコンテンツではなく、pageURL (ページ全体のキャッシュ) に関するものであるため、同様に機能しません。

お知らせ下さい。これを行う簡単なスクリプトはありますか。Pear::Cache_Lite は良さそうですが、実装が難しそうです。

更新: Cache_Lite を使用しました。それは同じだ。すべてまたは含まれている php ファイルをキャッシュします。操作できる構成オプションはほとんどありません。ただし、全体として使用すると、取得、投稿、セッション データの更新も無視されます...そして、削除されない限り、以前にキャッシュされたページが表示されます。

4

1 に答える 1

0

ディスプレイとロジックを分離できると思います。

つまり、フォームのアクション属性を変更し、キャッシュ ロジックを持たない php を指すようにします (CSRF などのセキュリティの問題を回避するために、トークンやセッションなどを使用してリファラーやその他のパラメーターを確認する必要があります)。

私が指摘したい他のことは、最も訪問されたページ (つまり、ホームページ) だけをキャッシュするように注意する必要があるということです。通常、キャッシュには「万能」というものはありません。ページについては心配しないほうがよいでしょう。速度/負荷の問題がない。または、速度の問題がデータベース クエリに起因する場合は、データをキャッシュすることをお勧めします (キャッシュを実装する前に、アプリケーションをプロファイリングする必要があります)。

機能する可能性のある他のアプローチは、要求メソッドをチェックし、それがポストの場合はキャッシュを無効にすることです (すべてのフォームが POST メソッドを使用している場合) を使用し$_SERVER['REQUEST_METHOD'] == 'POST'ます。

于 2013-01-26T23:36:04.213 に答える