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 数据没有发送到缓冲区,因此不需要这些调用。

这是我过去使用过的一种解决方案。不需要 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 回答