Моя проблема в основном заключается в следующем: у меня есть веб-страница, на которой запущено онлайн-радио на другом поддомене (Airtime sourcefabric). Теперь я понял, что у этого радио-плагина есть хороший API в реальном времени, поэтому я могу получить доступ к информации о предварительном, текущем и следующем треке (и показе) в JSON с этого URL: http://music.wickedradionet.com/api/live-info .
Мне нужно показать эту информацию на веб-странице. Я могу заставить его работать с интервалом javascript, обновляя информацию из URL API каждую секунду (или каждые 5 секунд, не имеет значения), но я думаю, что должен быть лучший способ сделать это.
Есть ли способ проверить, был ли файл изменен, и обновить информацию, только если они не совпадают? Я думаю, что это можно сделать с помощью некоторого хитрого PHP, такого как настройка задания CRON, или, возможно, с помощью WebSocket. Есть ли лучший способ, чем проверить его в интервале JS?
JavaScript, который я сейчас использую для обновления: http://wickedradionet.com/js/wickedradio-playlist.js
Ниже описаны два способа улучшения вашего опроса:
1) Более эффективный опрос AJAX
Вместо того, чтобы постоянно выполнять ajax-запрос каждую секунду (независимо от того, получаете вы данные) или нет, вы можете создать хакерское открытое соединение с сервером для опроса после завершения запроса, как показано ниже. Важная часть $.ajax()
вызов complete
вариант. timeout
(то есть 30 секунд), чтобы убедиться, что опрос продолжается, если цикл когда-либо прерывается.
(function betterPoll(){
$.ajax({ url: 'http://music.wickedradionet.com/api/live-info/', success: function (data) {
// do something with "data"}, dataType: "json", complete: betterPoll, timeout: 30000 });
})();
2) Соединение WebSocket
Еще лучшей альтернативой является WebSocket. Это позволяет полнодуплексному соединению с низкой задержкой оставаться открытым между клиентом и сервером, обеспечивая связь в режиме реального времени.
Если вы используете Node.js, документы привести примеры того, как вы можете использовать Socket.IO
для связи через WebSocket. Если вы используете PHP, быстрый поиск привел меня к Ratchet
а также PHP WebSockets
.
Ниже приведен пример использования Socket.IO:
В вашем HTML:
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script src="example.js"></script>
В «example.js» вы можете получить что-то вроде этого:
var socket = io.connect('http://music.wickedradionet.com/api/live-info/');
socket.on('an event', function (data) {
// do something with "data"socket.emit('another event', { other: 'data' });
});
На сервере вы могли бы сделать что-то подобное, используя .on('another event', function () {})
а также .emit('an event', function () {})
,
У вас есть точное время, когда файл изменится, это время, когда начинается следующая песня. Все, что вам нужно сделать, это рассчитать разницу во времени, чтобы запланировать новый запрос.
function stringToDate(s) {
s = s.split(/[-: ]/);
return new Date(s[0], s[1]-1, s[2], s[3], s[4], s[5]*1);
};
function getPlaylistData() {
$.ajax({
dataType: "jsonp",
url: "http://music.wickedradionet.com/api/live-info/",
success: function (result) {
/* Change your DOM, than calculate time for next request this way: */
var requestTime = stringToDate( result.schedulerTime ).getTime() - result.timezoneOffset*1000;
var nextChange = stringToDate( result.next.starts ).getTime();
var differenceInMiliseconds = nextChange-requestTime;
console.log( differenceInMiliseconds );
setTimeout(getPlaylistData, differenceInMiliseconds);
}
});
};
$(document).on('ready', function () {
getPlaylistData();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>