Я пытаюсь создать систему уведомлений в режиме реального времени без использования веб-сокетов или опросов, наиболее эффективным и быстрым способом без задержек и с минимальными затратами UX.
ЭтоИдея, которую я разработал до сих пор:
1- Каждый раз, когда пользователь (A) получает сообщение от другого пользователя (B), я использую PHP для передачи сообщений между пользователем A и B и MySQL для хранения транзакции.с отметкой времени.
2- Я запускаю Cronjob каждые 60 секунд для анализа данных MySQL в формате JSON и обновляю файл с именем data.JSON
, в котором хранятся все сообщения между всеми пользователями на моем веб-сайте (@Ребята из stackoverflow, в уведомлениях не будет никаких конфиденциальных данных или личных сообщений, если вы собираетесь меня за это арестовать!).Это означает, что файл обновляется каждые 60 секунд, независимо от того, есть ли новые данные для выборки или нет.И это пример вывода в формате JSON:
[
{
"notification": {
"user_ref": "00007939786",
"sender": "12089301923",
"message": "Message 1",
"created_at": "2019-02-11 14:47:11"
}
},
{
"notification": {
"user_ref": "00007939786",
"sender": "78921739812",
"message": "Message 2",
"created_at": "2019-02-11 14:46:11"
}
},
{
"notification": {
"user_ref": "00007939787",
"sender": "91290381920",
"message": "Message 3",
"created_at": "2019-02-11 14:34:11"
}
},
...
3- На веб-странице (например, index.html) также есть функция setInterval JavaScript, которая проверяет изменения в файле JSON каждые 60 секунд (такое же количество секунд, как и Cronjob).Вот как выглядит код jQuery для чтения файла JSON: https://codepen.io/mslilafowler/pen/xMjZmo?editors=0012
Подводя итог, функция пытается проверить, изменился ли файл вообще, и если файл изменился, проверьте, есть ли какие-либо уведомлениядля текущего пользователя, и если есть, проверьте, являются ли они новыми (то есть в течение прошлых 60 секунд, чтобы быть последовательными).Если все эти условия выполнены, подсчитайте количество новых уведомлений, а затем распечатайте новые сообщения (для целей тестирования все делается в консоли).
Я сделал все это в теории, иДо этого я работал с анализом данных MySQL в формате JSON, и это хорошо, но я столкнулся с парой проблем:
a) Это не может работать в реальном времени, как есть.Я искал во всей сети синхронизацию MySQL и JavaScript date-times-minus-60-секунд, но я наконец достиг стадии выгорания, потому что
b) PHP асинхронный, попытался использовать смесь Ajax и setInterval, чтобы получитьактуальное текущее время без обновления страницы.И это вызывает мой код, потому что он проверяет, есть ли новые уведомления в течение последних 60 секунд, и если пользователь не обновлял браузер в течение многих минут, то текущее время PHP остается тем же с момента инициации страницы,и тогда код будет отображать старые уведомления как «новые».
c) Дата и время JavaScript настолько отличаются от MySQL, что мне нужно использовать альтернативную библиотеку, такую как mentions.js, только для сравнения без разбивки часовых поясов.
d) Все это должно быть сделано без обновления страницы
e) Я изучил Websockets, Polling и Long Polling, но действительно предпочел бы, если бы это можно было сделать с помощью javascript /Только JSON, PHP и MySQL.
Так что я почти нахожусь в создании системы уведомлений, за исключением случаев, когда перепутаны.
Во-первых, каждый язык имеет свой собственный формат времени и часовой пояс, а во-вторых, более точный из языков асинхронный, что означает, что, хотя PHP более точен, я не могу получить текущее время PHP без обновлениястраница каждую секунду.
Мне кажется, что единственное реальное решение - это получить возвращенный результат от вызова Ajax внутри функции JavaScript setInterval, что-то вроде setInterval (function () {ajax-get-PHP-current-time}, 1000), но мои попытки безуспешно провалились.
Этот вопрос не требует взвешенных ответов, мне просто нужен совет о том, подходит ли этот метод, и предложение о том, как синхронизировать время между данными MySQL, PHP и JavaScript, без обновления страницы, в режиме реального времени, чтобы старые уведомления не добавлялись в новые уведомления в течение 60 секунд.