2

我有一个具有以下架构的网站:

End user     --->    Server A (PHP)        --->        Server B (ASP.NET & Database)
             web                    file_get_contents
           browser                  

服务器 A 是一个简单的 Web 服务器,主要服务于静态 HTML 页面。但是,有些内容是动态的,并且此内容是从服务器 B 获取的。示例:

someDynamicPageOnServerA.php:
<html>
     ...static stuff...

     <?php echo file_get_contents("http://serverB/somePage.aspx?someParameter"); ?>

     ...more static stuff...
</html>

这工作正常。但是,如果服务器 B 停机(维护、意外崩溃等),服务器 A 上的那些动态页面将会失败。因此,我想

  • 缓存 file_get_contents 的最后一个结果和
  • 如果 file_get_contents 超时,则显示此结果。

现在,实现这样的事情应该不会太难;但是,这似乎是一种常见的情况,我想避免重新发明轮子。是否有一些 PHP 库或内置功能可以帮助这种情况?

4

3 回答 3

3

我会做这样的事情:

function GetServerStatus($site, $port){
    $fp = @fsockopen($site, $port, $errno, $errstr, 2);
    if (!$fp) {
       return false;
    } else { 
       return true;
    }
}

$tempfile = '/some/temp/file/path.txt';

if(GetServerStatus('ServerB',80)){
     $content = file_get_contents("http://serverB/somePage.aspx?someParameter");
     file_put_contents($tempfile,$content);
     echo $content;
}else{
     echo file_get_contents($tempfile);
}
于 2012-02-22T15:21:10.413 回答
0

您可以检查文件的修改时间,只有在不同时才请求它,否则加载本地副本。此外,在 PHP 网站上对 filemtime 的评论中有一个缓存伪示例(来自:http://php.net/manual/en/function.filemtime.php

<?php
$cache_file = 'URI to cache file';
$cache_life = '120'; //caching time, in seconds

$filemtime = @filemtime($cache_file);  // returns FALSE if file does not exist
if (!$filemtime or (time() - $filemtime >= $cache_life)){
    ob_start();
    resource_consuming_function();
    file_put_contents($cache_file,ob_get_flush());
}else{
    readfile($cache_file);
}
?>
于 2012-02-22T15:43:01.920 回答
0

我接受了 dom 的回答,因为它是最有帮助的。我最终使用了一种稍微不同的方法,因为我想说明服务器可以通过端口 80 访问但其他一些问题阻止它提供请求的信息的情况。

function GetCachedText($url, $cachefile, $timeout) {
    $context = stream_context_create(array(
     'http' => array('timeout' => $timeout)));  // set (short) timeout

    $contents = file_get_contents($url, false, $context);

    $status = explode(" ", $http_response_header[0]); // e.g. HTTP/1.1 200 OK
    if ($contents === false || $status[1] != "200") {
        $contents = file_get_contents($cachefile); // load from cache
    } else {
        file_put_contents($cachefile, $contents);  // update cache
    }
    return $contents;
}
于 2012-02-22T16:44:43.150 回答