Ошибка в коде габбера

loed
На сайте с 10.03.2007
Offline
196
625

Доброго дня! Есть страничка которая забирает погоду с другого сайта. Проблема в том что если сайт с которого берется погода или страница недоступны, то у меня все что идет ниже кода граббера погоды в том числе и подвал не отображаютя. В чем может быть проблема?

Код:

<?include ($_SERVER['DOCUMENT_ROOT'].'/1.html');?> (подключается шапка сайта)

Погода:

<table width="80%" cellpadding=3 cellspacing=1 border=0>

<tr bgcolor=#779288>

<?php

$url = 'http://sait.ru/pogoda.html';

$beginBlock = '<tr bgcolor=#779288>';

$endBlock = '</tr></table>';

$fp = @fopen($url, 'r');

if (!$fp) exit();

$data = '';

while(!feof($fp))

{

$data .= fgets($fp, 8192);

}

fclose($fp);

$pattern = '%' . $beginBlock . '(.*)' . $endBlock . '%isU';

if (!preg_match($pattern, $data, $matches))

{

exit('dfgd');

}

echo isset($matches[1]) ? $matches[1] : '';

?>

</tr></table>

<?include ($_SERVER['DOCUMENT_ROOT'].'/2.html');?> (подключается подвал сайта)

Maxouni
На сайте с 18.11.2008
Offline
119
#1

конструкция exit тебе все портит, если урл не доступен код перестает обрабатываться!решений можно много замутить например выводить что погода не доступна или пару других урлов подгрузить!

Создание, продвижение, поддержка сайтов и приложений.
loed
На сайте с 10.03.2007
Offline
196
#2
Maxouni:
конструкция exit тебе все портит, если урл не доступен код перестает обрабатываться!решений можно много замутить например выводить что погода не доступна или пару других урлов подгрузить!

Спасибо, я уже в курсе насчет exit, проблема решена.

C
На сайте с 06.04.2009
Offline
13
#3

А если заменить это


if (!preg_match($pattern, $data, $matches))
{
exit('dfgd');
}

на это


if (!preg_match($pattern, $data, $matches))
{
if(file_exists(dirname(__FILE__).'/cache/weather.php')){
include dirname(__FILE__).'/cache/weather.php';
}
else
{
echo 'Сервер погоды временно недоступен';
}
}
else
{
file_put_contents(dirname(__FILE__).'/cache/weather.php','<?php $matches='.var_export($matches,1).'; ?>');
}

и создать в директории со скриптом поддиректорию cache с правами 777, то погода будет кешироваться, и при недоступности сайта погоды, она будет выводиться из кеша.

Кеш так же можно использовать для ускорения работы скрипта, тоесть грузить удаленную страницу не для каждого посетителя, а, например, раз в 15 минут. Все остальные зарпосы же брать из локального кеша.

http://www.weblancer.net/users/Tkachenko/ (http://www.weblancer.net/users/Tkachenko/)
alexspb
На сайте с 14.11.2005
Offline
187
#4

loed, вам самокат camokat правильно подсказывает, особенно про таймаут: вы пытаетесь при каждой загрузке погоду заполучить. А зачем? она же не ежесекундно меняется. Интвервал 2-3 часа вполне нормальный (либо по дате файла. либо в базу писать время последней проверки)

loed
На сайте с 10.03.2007
Offline
196
#5
camokat:
А если заменить это
и создать в директории со скриптом поддиректорию cache с правами 777, то погода будет кешироваться, и при недоступности сайта погоды, она будет выводиться из кеша.

Кеш так же можно использовать для ускорения работы скрипта, тоесть грузить удаленную страницу не для каждого посетителя, а, например, раз в 15 минут. Все остальные зарпосы же брать из локального кеша.

Очень заинтересовало такое решение. Все сделал как написали, теперь при недоступности страницы с погодой, погода всеравно показывается но в папке cache нет никакого файла weather.php??? Откуда она берется теперь??? Но все работает!!!

C
На сайте с 06.04.2009
Offline
13
#6

Хм, так не бывает. Если файла нет, то кеша не буде. Может Вы что то попутали или посмотрели в папку, когда кеша не было :) Довольно странная ситуация

loed
На сайте с 10.03.2007
Offline
196
#7

Да, сейчас появился.

C
На сайте с 06.04.2009
Offline
13
#8

Вот, дописал с запросом погоды раз в 2 часа с сервера, остальное время берется из кеша. Работать будет намного быстрее.


<?include ($_SERVER['DOCUMENT_ROOT'].'/1.html');?> (подключается шапка сайта)

Погода:
<table width="80%" cellpadding=3 cellspacing=1 border=0>
<tr bgcolor=#779288>

<?php
$url = 'http://sait.ru/pogoda.html';
$beginBlock = '<tr bgcolor=#779288>';
$endBlock = '</tr></table>';

$cachefile = dirname(__FILE__).'/cache/weather.php'; // файл кеша
$cache_time_config=7200; //время актуальности кеша 2 часа
//Проверяем наличие кеша
if(file_exists($cachefile)){
$cachetime = filemtime($cachefile); // время создание кеша
if ((time() - $cachetime) < $cache_time_config) { //если кеш не устарел - берем значение из него
$cache_used=true;
include $cachefile;
}
}

if(!$cache_used) // если не использовали кеш - заправшиваем страницу с сервера погоды
{
$pattern = '%' . $beginBlock . '(.*)' . $endBlock . '%isU';

$fp = @fopen($url, 'r');
if (!$fp) exit();
$data = '';
while(!feof($fp))
{
$data .= fgets($fp, 8192);
}
fclose($fp);
if (!preg_match($pattern, $data, $matches)) // страница не доступна
{
if(file_exists($cachefile)){ // берем из устаревшего кеша данные
include $cachefile;
}
else // кеш отсутствует
{
echo 'Сервер погоды временно недоступен';
}
}
else // сохраняем в кеш новое значение
{

file_put_contents($cachefile,'<?php $matches='.var_export($matches,1).'; ?>');
}
}

echo isset($matches[1]) ? $matches[1] : '';
?>
</tr></table>
<?include ($_SERVER['DOCUMENT_ROOT'].'/2.html');?> (подключается подвал сайта)
loed
На сайте с 10.03.2007
Offline
196
#9

Отлично! Огромное спасибо!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий