Перейти к публикации

Кэширование или асинхронная загрузка модуля


Рекомендованные сообщения

Всем привет.

 

У меня на сайте есть небольшой модуль погоды, погода берётся из файла xml на яндексе. Дело в том что главная страница не начинает погружаться пока не получит данные погоды, это время порой затягивается.

 

Модуль подключен при помощи тега

{include file="engine/modules/pogoda/index.php"}

 

Состоит модуль из двух файлов:

index.php

<?php require_once 'weather.php' ;

$w_city_id = 26714;
// Идентификатор города  - можно узнать по адресу http://weather.yandex.ru/static/cities.xml

$col = 1 ;
// количество дней, на сколько нужен прогноз

$day_of_the_week_array = array(
1 => '<span>в понедельник</span>',
2 => '<span>во вторник</span>',
3 => '<span>в среду</span>',
4 => '<span>в четверг</span>',
5 => '<span>в пятницу</span>',
6 => '<span>в субботу</span>',
7 => '<span>в воскресенье</span>'
); // Массив дней недели (для вывода)

$time_of_day = array(
0 => 'утро',
1 => 'день',
2 => 'вечер',
3 => 'ночь'
); // Массив времени суток (для вывода)

$wind = array(
 's' => 'южн.',
 'e' => 'вос.',
 'n' => 'сев.',
 'w' => 'зап.',
 'se' => 'ю-в',
 'sw' => 'ю-з',
 'ne' => 'с-в',
 'nw' => 'с-з',
) ;

$out = get_weather($w_city_id, $col, $day_of_the_week_array, $time_of_day)  ;

/* заполняем масив при помощи функции, первый параметр обязательный - индентификатор города
другие параметры необязательны - в этом случае используется значения по умолчанию */
?>
               
<?php foreach ($out as $key => $value) { ?>
<div class="poggl"><p><a href="/pogoda/3995-gusev.html">Погода в Гусеве »</a></p>
<?php echo $value['day']; ?>.<?php echo $value['month']; ?>.<?php echo $value['year']; ?> <?php echo $value['day_of_week']; ?></div>
<?php foreach ($value['weather'] as $key1 => $value1) { ?>
<div class="pogpere"><p><?php echo $value1['time_of_day']; ?><img src="http://yandex.st/weather/1.1.78/i/icons/30x30/<?php echo $value1['image']; ?>.png" width="30" height="30" alt="" /><?php echo $value1['temp_from'] ; ?> ... <?php echo $value1['temp_to'] ; ?></p>
<?php echo $value1['wind_speed'] ; ?> м/с <?php echo $wind[(string)$value1['wind_direction']] ; ?>, <?php echo $value1['pressure'] ; ?> мм рт. ст.</div>
<?php } ?>
<?php } ?>

weather.php

<?php

function get_weather ($city, $col = 10, $day_of_the_week_array = array(1 => 'пн', 2 => 'вт', 3 => 'ср', 4 => 'чт', 5 => 'пт', 6 => 'сб', 7 => 'вс'), $time_of_day = array(0 => 'утро', 1 => 'день', 2 => 'вечер', 3 => 'ночь')) {

$data_file = 'http://export.yandex.ru/weather-ng/forecasts/'.$city.'.xml';   // Загружаем файл прогноза погоды для выбранного города
$xml = simplexml_load_file($data_file); // загружаем xml файл через simple_xml

$out = array(); // Массив вывода прогноза
$counter = 0 ; // Счетчик количества дней, для которых доступен прогноз

foreach ( $xml->day as $day )  {

    if ($counter == $col) {break;}

   $get_date = explode ("-" , $day['date']) ;
   $day_of_week = date("N", mktime(0, 0, 0, $get_date[1], $get_date[2], $get_date[0])) ;

   $out[$counter]['day'] = $get_date[2] ;
   $out[$counter]['month'] = $get_date[1] ;
   $out[$counter]['year'] = $get_date[0] ;
   $out[$counter]['day_of_week'] = $day_of_the_week_array[$day_of_week] ;

   for ($i=0;$i<=3;$i++) {

   if($day->day_part[$i]->temperature == '') {

   $get_temp_from =  $day->day_part[$i]->temperature_from;
   $get_temp_to =  $day->day_part[$i]->temperature_to;
   $get_wind_speed =  $day->day_part[$i]->wind_speed;
   $get_wind_direction =  $day->day_part[$i]->wind_direction;
   $get_weather_type =  $day->day_part[$i]->weather_type;
   $get_weather_type =  iconv('UTF-8', 'windows-1251', $get_weather_type);
   $get_humidity =  $day->day_part[$i]->humidity;
   $get_pressure =  $day->day_part[$i]->pressure;
   $get_avg =  $day->day_part[$i]->{'temperature-data'}->avg;

    }  else {

    $get_temp_from = (integer)$day->day_part[$i]->temperature-1 ;
    $get_temp_to = (integer)$day->day_part[$i]->temperature+1 ;

    }

    if($get_temp_from>0 ) {$get_temp_from = '+'.$get_temp_from ; }
    if($get_temp_to>0 ) {$get_temp_to = '+'.$get_temp_to ; }
    $out[$counter]['weather'][$i]['temp_from'] = $get_temp_from;
    $out[$counter]['weather'][$i]['temp_to'] = $get_temp_to;
    $out[$counter]['weather'][$i]['image'] = $day->day_part[$i]->{'image-v3'};
    $out[$counter]['weather'][$i]['time_of_day'] = $time_of_day[$i] ;
    $out[$counter]['weather'][$i]['wind_speed'] = $get_wind_speed ;
    $out[$counter]['weather'][$i]['wind_direction'] = $get_wind_direction ;
    $out[$counter]['weather'][$i]['weather_type'] = $get_weather_type;
    $out[$counter]['weather'][$i]['humidity'] = $get_humidity;
    $out[$counter]['weather'][$i]['pressure'] = $get_pressure;
    $out[$counter]['weather'][$i]['avg'] = $get_avg;
	
	

} $counter++ ;
}

return $out ;

}?>

 

 

Подскажите, возможно ли сделать кэширование модуля или асинхронную загрузку, а лучше и то и другое?

 

Заранее признателен всем за подсказку.

Ссылка на сообщение
Поделиться на других сайтах

Получилось сделать асинхронную загрузку погоды, подключил модуль через iframe, всё работает. Так вообще правильно?

<iframe class="pogod" src="engine/modules/pogoda/gliframe.php" scrolling="no"></iframe>

 

И ещё сам файл модуля пришлось изменить, прописать в нём стили и т.п.

Подскажите, так допустимо?

<!doctype html>
<html>
<head>
<meta charset="windows-1251">
<style type='text/css'>
html, body {margin:0px;padding:0px;font-family:Tahoma, "Trebuchet MS", Helvetica, sans-serif;line-height:1.45}
.pogpere{float:left;width:206px;text-align:center;color:#FFFFFF;font-size:11px}
.pogpere p{height:22px;font-weight:bold;padding-bottom:8px;margin:5px 0;color:#000000;font-size:13px;}
.pogpere p img{margin:0 5px -12px 9px}
.poggl{width:150px;float:left;margin:0 0 0 25px;font-size:11px;color:#FFFFFF}
.poggl p{font-weight:bold;font-size:15px;color:#000000;margin:10px 0 0;height:30px}
.poggl span{font-size:12px}
.poggl a{color:#000;text-decoration:none;-webkit-transition-duration:0.5s;-o-transition-duration:0.5s;-moz-transition-duration:0.5s;transition-duration:0.5s}
.poggl a:hover{color:#008ED6}
</style>
</head>
<body>
<?php require_once 'weather.php' ;

$w_city_id = 26714;
// Идентификатор города  - можно узнать по адресу http://weather.yandex.ru/static/cities.xml

$col = 1 ;
// количество дней, на сколько нужен прогноз

$day_of_the_week_array = array(
1 => '<span>в понедельник</span>',
2 => '<span>во вторник</span>',
3 => '<span>в среду</span>',
4 => '<span>в четверг</span>',
5 => '<span>в пятницу</span>',
6 => '<span>в субботу</span>',
7 => '<span>в воскресенье</span>'
); // Массив дней недели (для вывода)

$time_of_day = array(
0 => 'утро',
1 => 'день',
2 => 'вечер',
3 => 'ночь'
); // Массив времени суток (для вывода)

$wind = array(
 's' => 'южн.',
 'e' => 'вос.',
 'n' => 'сев.',
 'w' => 'зап.',
 'se' => 'ю-в',
 'sw' => 'ю-з',
 'ne' => 'с-в',
 'nw' => 'с-з',
) ;

$out = get_weather($w_city_id, $col, $day_of_the_week_array, $time_of_day)  ;

/* заполняем масив при помощи функции, первый параметр обязательный - индентификатор города
другие параметры необязательны - в этом случае используется значения по умолчанию */
?>
               
<?php foreach ($out as $key => $value) { ?>
<div class="poggl"><p><a href="/pogoda/3995-gusev.html">Погода в Гусеве »</a></p>
<?php echo $value['day']; ?>.<?php echo $value['month']; ?>.<?php echo $value['year']; ?> <?php echo $value['day_of_week']; ?></div>
<?php foreach ($value['weather'] as $key1 => $value1) { ?>
<div class="pogpere"><p><?php echo $value1['time_of_day']; ?><img src="http://yandex.st/weather/1.1.78/i/icons/30x30/<?php echo $value1['image']; ?>.png" width="30" height="30" alt="" /><?php echo $value1['temp_from'] ; ?> ... <?php echo $value1['temp_to'] ; ?></p>
<?php echo $value1['wind_speed'] ; ?> м/с <?php echo $wind[(string)$value1['wind_direction']] ; ?>, <?php echo $value1['pressure'] ; ?> мм рт. ст.</div>
<?php } ?>
<?php } ?>

</body>
</html>

 

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...