Отказоустойчивый file_get_contents - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть сайт со следующей архитектурой:

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

Сервер A - это простой веб-сервер, в основном обслуживающий статические 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 или встроенная функция, которая помогает при таком сценарии?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

я бы сделал что-то вроде этого:

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 голосов
/ 22 февраля 2012

Я принял ответ домина, так как он был самым полезным. В итоге я использовал немного другой подход, так как я хотел учесть ситуацию, когда сервер доступен через порт 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;
}
0 голосов
/ 22 февраля 2012

Вы можете проверить время изменения файла и запросить его, только если он отличается, в противном случае загрузите локальную копию.Кроме того, в комментариях к filemtime на веб-сайте PHP есть псевдо-пример кэша (от: 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);
}
?>
...