2012-02-22 6 views
2

私は、次のアーキテクチャでウェブサイトを持っている:フォールトトレラントのfile_get_contents

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

サーバAは、主に静的なHTMLページを提供する、シンプルなWebサーバです。ただし、一部のコンテンツは動的で、このコンテンツはサーバー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ライブラリやビルトイン機能はありますか?

+0

何も組み込まれていませんが、実行するのは簡単です。スクリプトで定期的にそのファイルを取得してローカルコピーに保存し、代わりにそのローカルコピーを提供します。 –

+0

@MarcB:いい選択肢です。当面は、データベースの変更を「できるだけ早く」(「次の同期間隔で」ではなく)ウェブで利用できるようにしたいので、これを避けたいと思います。 – Heinzi

+0

次に、リモートの信頼できないサーバーが、変更が行われるとすぐに更新されたデータをプッシュできる「ディスプレイ」サーバー上に単純な受信者サービスを設定します。受信者はファイルをローカルキャッシュコピーに書き出す処理を行います。リモートサーバーが消滅した場合は、旧式の古いコピーを提供するだけです。そうしないと、変更が行われるたびに新しいコピーが作成されます。 –

答えて

2

は、私はこのようなsomethinを行うだろう:

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); 
} 
+0

ありがとう、これは役に立ちました。私は別の答えとして使用して解決策を追加しました。 – Heinzi

0

あなたがそうでない場合は、ローカルコピーを読み込み、ファイルの更新日時をチェックして、それが異なる場合にのみ、それを要求することができます。また、キャッシュ擬似例は、(:http://php.net/manual/en/function.filemtime.phpから):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); 
} 
?> 
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; 
}