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