2

次のアーキテクチャの Web サイトがあります。

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 Web サイトの 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

それが最も役に立ったので、私はドムの答えを受け入れました。サーバーがポート 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 に答える