автоматическое уведомление при смене базы данных: аналогично запросу в друзьях на Facebook - PullRequest
4 голосов
/ 25 декабря 2011

Я хочу развить сайт социальной сети на основе php mysql.Зарегистрированные пользователи будут иметь возможность добавить другого пользователя в друзья, как это делается в Facebook.

Если пользователь A нажимает ссылку «добавить друга» в профиле пользователя B, записи запроса друзей будут сделаны вБазы данных А и Б соответственно.Когда B посещает страницу ожидающих запросов на добавление в друзья (как, например, страницу профиля), будет показан запрос, запрашивающий базу данных B. Я думаю, это довольно просто сделать.

Но пока B онлайнC может отправить запрос о дружбе в B. Я хочу уведомить B о том, что C сделал такой запрос, даже если B не обновляет страницу своего профиля (или любую страницу с возможностью показать ожидающего друга).Запросы ).Что касается типа уведомления, это может быть поле, показывающее общее количество ожидающих запросов на добавление в друзья.Нажатие на поле покажет детали.Или это может быть в любой другой форме.

Меня интересует, как сообщить B о новом запросе на добавление в друзья, пока B находится в сети, не заставляя его обновить страницу, содержащую запросы на добавление в друзья?

Ответы [ 4 ]

9 голосов
/ 27 декабря 2011

Чтобы завершить ответы, я предполагаю, что вы хорошо понимаете логику DATA базы данных / уведомлений, и теперь вас беспокоит только КАК доставить его в браузер.Я перечислю все пункты здесь.

  1. HTTP - это протокол PULL .Вы не можете отправить данные с сервера на клиент.
  2. Итак, вы можете - постоянно опрашивать сервер на предмет новых уведомлений.

Вы можете сделать дватипы опроса: -

  1. Короткий опрос - Вы отправляете Ajax-запрос на сервер для новых уведомлений.
    • Это короткий запрос, но вы выполняете его непрерывно с интервалом (скажем, 10 с)
    • Сервер обрабатывает PHP и сразу же возвращает.
    • Вы обрабатываете возвращенные данные(например, Показать уведомления)
  2. Длинный опрос - Вы отправляете тот же запрос, что и выше.НО ...
    • В этом случае запрашиваемый PHP-файл входит в бесконечный цикл, непрерывно проверяя БД.
    • Когда происходит изменение БД, PHP-файл "выводит" его и завершаетпетля.Теперь запрос завершен, и данные получены в браузере.
    • Вы обрабатываете данные.
    • Запустите еще один Ajax-запрос с длинным опросом, и шаги повторяются.
    • (Дополнительно: если PHP не завершен в определенный тайм-аут, прервите текущий запрос и запустите новый.)

Далее, вы можете реализовать любой из них в дваразными способами: -

  1. Напишите свой собственный код Javascript - Нужен некоторый опыт, но вы можете его изучить!
  2. Использовать некоторые библиотеки - Простота и экономия времени.Вы можете использовать PubNet , BeaconPush и т. Д.

Я надеюсь, что это дает вам ясную идею!

3 голосов
/ 25 декабря 2011

вам нужно написать javascript, который отправляет запрос на сервер после каждого интервала времени. а затем на стороне сервера вы можете запросить базу данных и ответить клиенту, если появятся какие-либо новые запросы на добавление в друзья.

использовать функцию setinterval javascript

var refreshId = setInterval(function(){  
$.ajax({
type: "POST",
url: "request.php",
data: 'more_updates='+more_updates, // or any data you want to send
cache: false,
success: function(html){
$('.old_updates').prepend(html).fadeIn('fast'); // response from server side process
}
});
}

},10000);

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

2 голосов
/ 25 декабря 2011

Во-первых, вам не нужно хранить отдельные базы данных / таблицы для каждого человека.Вы можете хранить одну таблицу базы данных со следующими столбцами:

table_friendship

+------+---------------+-------------+------------+
|  id  |  friend_from  |  friend_to  |  approved  |
+------+---------------+-------------+------------+
|  1   |      A        |      B      |     NO     |
+------+---------------+-------------+------------+
|  2   |      C        |      B      |     NO     |
+------+---------------+-------------+------------+

Здесь, в этой таблице, запись 1 означает, что A запрашивает дружбу B и НЕ подтверждена.Запись 2 означает, что C запрашивает дружбу B и пока НЕ ​​одобрена.

Следующим шагом является уведомление «B» о том, что на сервер поступили два запроса.К сожалению, сервер не может отправлять сообщения клиенту (браузеру).Поэтому мы постоянно опрашиваем сервер с помощью AJAX-запроса.Запрос работает как любой другой запрос страницы, но разница в том, что вы можете запросить страницу PHP без перезагрузки браузера.

Вы можете запросить страницу friend_requests.php с интервалом в 10 секунд.Страница должна выполнить следующие действия:

  1. Выполнить SQL "SELECT COUNT(*) FROM table_friendship WHERE friend_to = B AND approved = "NO" (только для псевдо-SQL!)
  2. Вернуть следующие данные: количество ожидающих запросов и новые запросыи т. д.

На стороне браузера вы можете отобразить эти данные в указанной вами «КОРОБКЕ».

При утверждении запроса вы снова отправляете запрос AJAX надругая страница PHP, чтобы изменить столбец approved на «ДА»

Подробнее об Ajax - ru.wikipedia.org / wiki / Ajax_ (программирование)

1 голос
/ 25 декабря 2011

Я думаю, что вы ищете службу push-уведомлений.

Вы можете реализовать свою собственную (используя Comet) или подписаться на публичную службу.

Примеры:

PubNub , BeaconPush

С Google вы найдете гораздо больше.

Редактировать

Я думаю, что мой ответ не был достаточно ясным.С моим предложением вы могли бы сделать это (используя pubnub):

Пользователь B (идентификатор пользователя 7) записывает запрос на добавление в друзья пользователю A (идентификатор пользователя 8).В вашем обработчике PHP вы делаете:

$pubnub->publish(array(
    'channel' => 'friend_requests_8',
    'message' => array( 'request_from' => '7' )
));

Я не очень привык к php, но я надеюсь, вы понимаете, о чем я.

На странице клиента вы можете просто зарегистрироваться на своемchannel ('friend_request_'), а затем обработать запросы:

// PUBNUB.subscribe() - LISTEN
PUBNUB.subscribe({
    channel  : "friend_request_<? echo $user_ID; ?>",
    callback : function(message) { alert('FRIEND REQUEST FROM USER ID: ' + message.request_from) }
})

Так что с этим решением вам не придется обрабатывать какие-либо временные интервалы или циклы, потому что pubnub обрабатывает это для вас.Это делает Facebook (насколько мне известно), и BeaconPush используется EA для Battlelog, который, на мой взгляд, является отличным веб-сайтом с множеством интересных веб-технологий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...