0

私のコード:

<? 
    $url = 'http://w1.weather.gov/xml/current_obs/KGJT.xml'; 
    $xml = simplexml_load_file($url); 
?>

<? 
    echo $xml->weather, " ";
    echo $xml->temperature_string;
?>

これはうまく機能しますが、外部データのキャッシュはページ速度にとって必須であると読みました。これを5時間キャッシュするにはどうすればよいですか?

を調べましたがob_start()、これを使用する必要がありますか?

4

2 に答える 2

1

ob_start素晴らしい解決策ではないでしょう。これは、出力バッファーを変更またはフラッシュする必要がある場合にのみ適用されます。XML で返されたデータはバッファに送信されていないため、これらの呼び出しは必要ありません。

これは、私が過去に使用した1つのソリューションです。データはフラット ファイルに保存されるため、MySQL やデータベースは必要ありません。

$last_cache = -1;
$last_cache = @filemtime( 'weather_cache.txt' ); // Get last modified date stamp of file
if ($last_cache == -1){ // If date stamp unattainable, set to the future
    $since_last_cache = time() * 9;
} else $since_last_cache = time() - $last_cache; // Measure seconds since cache last set

if ( $since_last_cache >= ( 3600 * 5) ){ // If it's been 5 hours or more since we last cached...

    $url = 'http://w1.weather.gov/xml/current_obs/KGJT.xml'; // Pull in the weather
    $xml = simplexml_load_file($url); 

        $weather = $xml->weather . " " . $xml->temperature_string;

    $fp = fopen( 'weather_cache.txt', 'a+' ); // Write weather data to cache file
    if ($fp){
        if (flock($fp, LOCK_EX)) {
           ftruncate($fp, 0);
           fwrite($fp, "\r\n" . $weather );
           flock($fp, LOCK_UN);
        }
        fclose($fp);
    }
}

include_once('weather_cache.txt'); // Include the weather data cache
于 2012-08-13T02:47:16.070 に答える
1

ob システムはスクリプト内キャッシュ用です。永続的なマルチ呼び出しキャッシングには役に立ちません。

これを適切に行うには、結果の xml をファイルから書き出します。スクリプトを実行するたびに、そのファイルの最終更新時刻を確認します。5 時間を超える場合は、新しいコピーを取得して保存します。

例えば

$file = 'weather.xml';
if (filemtime($file) < (time() - 5*60*60)) {
    $xml = file_get_contents('http://w1.weather.gov/xml/current_obs/KGJT.xml');
    file_put_contents($file, $xml);
}
$xml = simplexml_load_file($file); 

echo $xml->weather, " ";
echo $xml->temperature_string;
于 2012-08-13T02:47:38.663 に答える