Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Выводим погоду на сайт и в трансляцию в OBS

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вообщем остановился я на этом скрипте по выводу погоды
 

Код:
 
<?php
$city2_id=000000; // id города openweather.org
$appid = '000000000000000000000000000000'; //ключ API, см. статью
$data_file2="http://api.openweathermap.org/data/2.5/weather?id=$city2_id&mode=xml&lang=ru&units=metric&appid=$appid"; // адрес xml файла
$data_file2 = file_get_contents($data_file2,0); //получаем данные о погоде из xml файла
$xml2 = new SimplexmlElement($data_file2); //помещаем данные в массив
$city2= $xml2->city[name];//забиваем необходимые данные в переменные
$temperarure = $xml2->temperature[value];
$weather_id = $xml2->weather[number];
$weather_icon = $xml2->weather[icon];
$weather_type = $xml2->weather[value];
$pressure = $xml2->pressure[value];
$humidity = $xml2->humidity[value];
$sunrise = $xml2->city->sun[rise];
$sunset = $xml2->city->sun[set];
$windspeed = $xml2->wind->speed[value];
$windcode = $xml2->wind->direction[code];
 
if ($temperarure>0) {$temperarure='+'.$temperarure;}// Если значение температуры положительно, для наглядности добавляем "+"
$pressure = $pressure * 0.75006375541921; //переводим из hPa в mmHg
$pressure = round($pressure); //округляем
$temperarure = round($temperarure);
$sunrise = date('H:i',strtotime("+3 hours", strtotime($sunrise)));//меняем формат даты и прибавляем 4 часа
$sunset = date('H:i',strtotime("+3 hours", strtotime($sunset)));
 
$title = $weather_type.", температура: ".$temperarure."<sup>o</sup>C,<br>давление: ".$pressure." мм рт. ст., ветер: ".$windspeed." м/с <br>влажность: ".$humidity."%, восход: ".$sunrise.", закат: ".$sunset;//формируем данные для вывода в title картинки
//echo ("<img src=\"/blocks/weather/images/$weather_icon.png\" alt=\"$weather_type\" title=\"$title\" >"); //путь к кртинкам должен быть абсолютным
echo ("<meta http-equiv='refresh' content='10'>"); //Refresh by HTTP META
echo ("$title");//выводим все безобразие
 
?>
 

 
И всё это дело я вывожу в трансляцию через OBS
Но недавно стал останавливаться вывод с ошибкой пока не записал, как только будет сюда опубликую, пока не нажмешь в OBS обновить КЭШ  
 
Или тут обновление я 10 слишком часто указал меня их сайт отрубает или OBS глючит, но OBS не может вроде сам обновлять инфу из PHP

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 13:22 15-11-2018 | Исправлено: exMIB, 13:25 15-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
вывод с ошибкой пока не записал

Лучше указать. А вообще не рекомендуется при каждом запросе к странице делать запрос к API. Во первых задержка, во вторых - могут быть ограничения на количество запросов. Лучше кэшировать на какое то время данные.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 14:57 15-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не смог все переписать, т.к. вывод текста ограничивается рамкой
 
только вот это пока видел  
 

Код:
 
Warning: file_get_contents(http://api.openweathermap.c...
 

 
Обновил КЭШ в элементе Броузер в OBS и снова заработало
Слежу дальше
 
Или OBS барахлит или PHP или веб-сервер или сайт отрубает потому что много запрашиваю
 
Но я не могу вычислить, как часто надо делать запрос и как часто обновляется инфа о погоде или умеет ли OBS сам обновлять делаю это в самом PHP

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 20:52 19-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
Но я не могу вычислить, как часто надо делать запрос и как часто обновляется инфа о погоде

почитать документацию к API, там все должно быть указано. ну и в случае погоды делать запросы чаще, чем раз в 5-10 минут (если не больше), несколько странно )  
 
ps: https://openweathermap.org/price
бесплатно не больше 60 в минуту (то есть раз в секунду), но тут зависит от того, как часто этот скрипт запускается.

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 20:53 19-11-2018 | Исправлено: Mavrikii, 20:55 19-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот в логах веб-сервера ошибки
 

Код:
 
[19-Nov-2018 05:14:00 Europe/Moscow] PHP Warning:  file_get_contents(http://api.openweathermap.org/data/2.5/weather?id=000000&amp;mode=xml&amp;lang=ru&amp;units=metric&amp;appid=0000000000000000000000000000000000): failed to open stream: HTTP request failed!  in C:\xxxx\xxxxx\localhost\pogoda\pogoda3.php on line 5
[19-Nov-2018 05:14:01 Europe/Moscow] PHP Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in C:\xxxx\xxxxx\localhost\pogoda\pogoda3.php:6
Stack trace:
#0 C:\xxxx\xxxxx\localhost\pogoda\pogoda3.php(6): SimpleXMLElement->__construct('')
#1 {main}
  thrown in C:\xxxx\xxxxx\localhost\pogoda\pogoda3.php on line 6
 


Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 20:57 19-11-2018 | Исправлено: exMIB, 20:57 19-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
Uncaught exception 'Exception' with message 'String could not be parsed as XML'  

полученный ответ от сервера не является XML строкой. нужно смотреть что конкретно там возвращается.
судя по ошибке в file_get_contents - сервер рвет соединение и выдает либо 403, либо 404, либо еще что то, отличное от ответа 200. после чего, конечно же, этот ответ не может быть использован для XML парсинга.
 

Код:
if (!($data_file2 = @file_get_contents($data_file2, false)) {
$error = error_get_last();
die('Ну не смогла я! - ' . $error['message']);
}

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 20:58 19-11-2018 | Исправлено: Mavrikii, 21:03 19-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
if (!($data_file2 = @file_get_contents($data_file2, false)) {
$error = error_get_last();
die('Ну не смогла я! - ' . $error['message']);
}  

 
Это типа при такой ошибке вместо ошибки чтобы выводился текст "Ну не смогла я !" ?
 
Я не чайник в программировании всю жизнь только учусь
Как же решить эту проблему ?
Она не постоянная, но не хорошая, т.к. комп автоматически её не стирает висит и всё
Но нажимаешь обновить КЭШ в OBS решилась, хотя помню как-то вроде и этой кнопкой не решалась
 
Где затык происходит пока непонятно
 
Добавлено:
Можете какой код добавить что писал более подробный лог в файл ?

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 21:06 19-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
чтобы выводился текст "Ну не смогла я !" ?

Ну да, при этом работа скрипта прекращается.
 

Цитата:
Как же решить эту проблему ?  

для начала нужно определиться, что в сообщении от сервера. далее либо повторить запрос, либо, как и говорил, лучше всего кэшировать данные (просто тупо сбрасывать в файл/базу), если ошибка - выводить старые. а лучше смотреть время последнего получения данных, если больше какого то лимита - делать запрос, если меньше - выводить предыдущие данные. нет смысла делать запрос каждые 10 секунд (или сколько там у вас). тем более с таким ограничением на бесплатные запросы - 10 открытых страниц с автообновлением и все, лимит превышен.
 
ps: для бОльшего контроля и получения сообщения об ошибках лучше использовать cURL, а не простой file_get_contents - он слишком ограничен в своих возможностях изначально. дополнение кода с кэшированием:

Код:
$keep = 60; // в секундах
$cache_file = 'data.tmp'; // имя файла и путь, куда сохраняются данные
$data_file2 = null;
if (!file_exists($cache_file) || time() - mtime($cache_file) > $keep) {
  $data_url = "http://api.openweathermap.org/data/2.5/weather?id=$city2_id&mode=xml&lang=ru&units=metric&appid=$appid"; // адрес xml файла  
  $data_file2 = @file_get_contents($data_url, false); //получаем данные о погоде из xml файла
  if ($data_file2)
    file_put_contents($cache_file, $data_file2);
}
 
if (!$data_file2)
 if (!file_exists($cache_file))
    die('Нет данных);
  else
    $data_file2 = file_get_contents($cache_file);    
 

что то типа такого

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 21:09 19-11-2018 | Исправлено: Mavrikii, 21:21 19-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
ps: для бОльшего контроля и получения сообщения об ошибках лучше использовать cURL, а не простой file_get_contents - он слишком ограничен в своих возможностях изначально.
 

 
Спасибо за подробное описание
Осталось найти программиста

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 21:17 19-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
Осталось найти программиста

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

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 21:21 19-11-2018 | Исправлено: Mavrikii, 21:23 19-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
я вам выше накидал, как это в принципе должно быть.
требуется наличие хотя бы одного запроса без ошибки для нормальной работы.
вместо die можно выводить страницу с обновлением все равно, но без данных.  
но, как и написал, если будет хотя бы один нормальный запрос и появится файл с закэшированными данными, то должно работать без проблем.

 
Оно понятно, что наверное не сложно, но не всё понятное одному понятно другому так как мир не простой и много других ребусов
 
Добавлено:
Лучше написать 5 строк кода, чем много текста Вот за это я был бы благодарен

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 21:28 19-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
что наверное не сложно,

я вам код написал, посмотрите внимательнее.
ед, что стоит может добавить, проверку парсинга XML строки, если сервер вернет что то иное, отличное от XML

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 21:30 19-11-2018 | Исправлено: Mavrikii, 21:56 19-11-2018
exMIB



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А как в этом же файле вывести время обновления погоды ?
 
Думал через дату обновления какого-то файла, но файлы вроде не создаются
 
Что за переменная с датой последнего обновления в данном случае ?

Всего записей: 3298 | Зарегистр. 27-09-2001 | Отправлено: 05:07 23-08-2019
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
exMIB

Цитата:
но файлы вроде не создаются

кэш файл должен создаваться, его время и использовать
или смотреть xml файл, есть ли там время указанное сервером

Всего записей: 15038 | Зарегистр. 20-09-2014 | Отправлено: 05:24 23-08-2019
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Выводим погоду на сайт и в трансляцию в OBS


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru