Как Facebook, Gmail отправляет оперативное уведомление?

Я решил проблему с rmtree makedirs, добавив time.sleep() между:

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)
265
задан Community 23 May 2017 в 02:34
поделиться

1 ответ

То, как Facebook это делает, довольно интересно.

Распространенным методом отправки таких уведомлений является опрос сценария на сервере (с использованием AJAX) через заданный интервал (возможно, каждые несколько секунд), чтобы проверить, не произошло ли что-то. Однако это может быть довольно интенсивным в сети, и вы часто делаете бессмысленные запросы, потому что ничего не произошло.

Facebook использует метод кометы, а не интервальный опрос, как только один опрос завершается, он выдает еще один. Однако каждый запрос к сценарию на сервере имеет очень долгий тайм-аут, и сервер отвечает на запрос только после того, как что-то произошло. Вы можете увидеть это, если откроете вкладку «Консоль Firebug» в Facebook, где запросы к сценарию могут занять несколько минут. Это действительно гениально, поскольку этот метод сразу же сокращает количество запросов и частоту их отправки. Фактически теперь у вас есть структура событий, которая позволяет серверу «запускать» события.

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

С точки зрения реальной технологии, здесь лучше всего использовать AJAX, потому что вы можете контролировать тайм-ауты запросов и многое другое. Я бы порекомендовал (здесь клише переполнения стека) использовать jQuery для выполнения AJAX, это избавит от многих проблем с перекрестной совместимостью. Что касается PHP, вы можете просто опросить таблицу базы данных журнала событий в своем PHP-скрипте и возвращаться к клиенту только тогда, когда что-то произойдет? Есть, я полагаю, много способов реализовать это.

Реализация:

Сторона сервера:

Кажется, есть несколько реализаций библиотек комет в PHP, но, честно говоря, это действительно очень просто, что-то вроде следующего псевдокода :

while(!has_event_happened()) {
   sleep(5);
}

echo json_encode(get_events());
  • Функция has_event_happened просто проверит, произошло ли что-нибудь в таблице событий или что-то в этом роде, а затем функция get_events вернет список новых строк в таблице? На самом деле зависит от контекста проблемы.

  • Не забудьте изменить максимальное время выполнения PHP, иначе он преждевременно истечет!

Клиентская сторона:

Взгляните на плагин jQuery для взаимодействия с Comet :

424
ответ дан 23 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: