Кто-нибудь может сказать, как извлекать данные из базы данных, такие как уведомление Facebook. мое требование: у меня есть таблица пользователя и таблица сообщений, когда пользователю нужно отправить сообщение, запись делается в таблице сообщений с идентификатором пользователя отправителя и получателя. поэтому мне нужно показать статус нового входящего сообщения получателю в режиме реального времени.
Это очень похоже на ajax, за исключением того, что цель отличается: более открытые сокеты висят и меньше запросов против большего количества запросов и менее открытых сокетов. JS делает запрос на сервер (2 из них на самом деле), и сервер не отвечает немедленно, вместо этого зависает и спит, пока на самом деле данные не будут отправлены клиенту, и в этом случае он немедленно возвращает содержимое. Причина того, что у вас есть 2 открытых висячих запроса, состоит в том, что когда один из них разыгрывает второй, он все еще готов получать уведомления, в то время как один из них снова подключается. Таким образом всегда есть хотя бы один висячий запрос. Можно проверить APE, или COMET, или «reverse ajax», или «длительный опрос с помощью javascript». Есть преимущества и недостатки в использовании длинных опросов вместо классического опроса, я бы предложил вам посмотреть, какой из них лучше подходит вашему сценарию.
ура
Я знаю, что Facebook что-то делает с событием mousemove в javascript в сочетании с таймаутом. Если вы не перемещаете курсор, событие получения уведомлений не запускается. Когда вы перемещаете курсор и не указывается тайм-аут, возникает событие получения уведомлений и отправляется новый тайм-аут. Если истекает этот новый таймаут, событие запускается, и если курсор не был перемещен, новый таймаут не будет установлен.
Чтобы получить уведомление, используйте ajax для получения непрочитанных сообщений для таблицы сообщений.
Эта технология называется Comet. Идея состоит в том, что JavaScript делает вызов AJAX сервером. Сервер принимает соединение и ничего не возвращает, пока не найдет что-то для клиента. Представьте, что если я хочу получать мгновенные уведомления, мой браузер вызывает вызов AJAX на сервер, сервер ищет новое уведомление в базе данных. Если они есть, это немедленно возвращает их, если не просто спит, например, 0,5 секунды, а затем снова запрашивать базу данных, пока не найдет там что-то новое.
Вот пример кода создания Comet:
<? if(!isset($_POST['notificationLastId'])){ exit; } // Query database every 0.5 seconds $interval = 0.5; // Hold maximum 30 seconds $timeout = 30; // You need to close session if it open otherwise all other queries within // same session will hang, because of session locking session_write_close(); $startTime = time(); $response = array(); while (true){ // Query database to see if there are any new // notifications with id greater then $_POST['notificationLastId'] if(count($newNotifications) or time()-$startTime > $timeout){ $response['newNotifications'] = $newNotifications; // get last id of notifications table $response['lastId'] = $notificationLastId header('Content-type: application/json'); echo json_encode($response); } // Sleep not to cosume too much server resources usleep($interval*1000000); } exit; ?>
вы можете использовать AJAX для определенной части таблицы для регулярной проверки новых обновлений. но это будет потреблять максимальные ресурсы сервера, поэтому для этого решения необходимо использовать другой сервер и выполнить задание cron с AJAX для регулярных обновлений.
Если вы говорите, так же, как в чате, было бы лучше пойти с APE, поскольку это соответствует вашим требованиям.