notificação automática na mudança de database: semelhante com pedido de amigo do Facebook

Eu desejo desenvolver um site de rede social baseado em php mysql. Os usuários registrados terão a opção de adicionar outro usuário como amigo, tal como é feito no Facebook.

Se o usuário A clicar no link ‘adicionar amigo’ no perfil do usuário B, os registros de amizade serão feitos nos bancos de dados de A e B de acordo. Quando B visita a página de exibição de amigos – solicitações – mostrando (como tal, a página de perfil), o pedido será mostrado consultando o db do B. Isso é muito simples de fazer, eu acho.

Mas enquanto B está online, C pode fazer um pedido de amigo para B. Eu quero fazer uma notificação para B que C fez tal pedido, mesmo que a B não atualize sua página de perfil (ou qualquer página com a opção de mostrando os pedidos de amizade em espera). Quanto ao tipo de notificação, pode ser uma checkbox mostrando o número total de pedidos de amigos aguardando. Clicando na checkbox mostrará os detalhes. Ou pode ser de qualquer outra forma.

Meu ponto de interesse é como fazer B ciente de uma nova solicitação de amizade, enquanto B está online sem fazê-lo atualizar a página contendo os pedidos de amigos?

Para finalizar as respostas, suponho que você entenda bem a lógica DATA de database / notificação, e agora você está preocupado apenas com COMO COMPRAR o navegador. Vou listar todos os pontos aqui.

  1. HTTP é um protocolo PULL . Você não pode enviar dados do Servidor para Cliente.
  2. Então, o que você pode fazer é – pesquisar continuamente o servidor para novas notifications.

Você pode fazer dois tipos de votação: –

  1. Pesquisa curta – Você envia uma solicitação Ajax para o servidor para novas notifications.
    • Este é um pedido curto, mas você faz isso continuamente em um intervalo (digamos 10s)
    • O servidor processa o PHP e retorna imediatamente.
    • Você processa os dados retornados (por exemplo, exiba notifications)
  2. Long-polling – Você envia o mesmo pedido acima. MAS…
    • Nisto, o arquivo PHP solicitado entra em um loop infinito, verificando DB de forma contínua.
    • Quando uma mudança de DB está lá, o arquivo PHP “ecoá-lo” e termina o loop. Agora, a solicitação está concluída e os dados são recebidos no Navegador.
    • Você processa os dados.
    • Inicie outra solicitação do Ajax de longa pesquisa e as etapas repetirem novamente.
    • (Extra: se o PHP não for concluído em um tempo limite específico, então aborte a solicitação atual e comece uma nova.)

Em seguida, você pode implementar qualquer um destes em duas maneiras diferentes: –

  1. Escreva seu próprio código Javascript – Precisa de algum conhecimento, mas você pode aprender!
  2. Use algumas bibliotecas – Fácil e com economia de tempo. Você pode usar PubNet , BeaconPush etc.

Espero que isso faça uma idéia clara para você!

você precisa escrever javascript que envia solicitação ao servidor após cada intervalo de tempo. e, no lado do servidor, você pode consultar o database e responder ao cliente se houver solicitações de novos amigos.

use a function javascript setinterval

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); 

Aqui estamos enviando dados a cada dez segundos. Então, no lado do servidor, se tivermos qualquer novo pedido de amizade pendente, que seja novo ou não confirmado, atualiza o lado do cliente.

Primeiro, você não precisa manter bases de dados / tabelas separadas para cada pessoa. Você pode manter uma única tabela de database com as seguintes colunas:

table_friendship

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

Aqui nesta tabela, a input 1 significa que A solicita B para amizade e NÃO é aprovado. Entrada 2 significa que C solicita B para amizade, e NÃO aprovado ainda.

Próximo passo, é notificar “B” que dois pedidos foram recebidos no servidor. Infelizmente, o servidor não pode enviar mensagens para o cliente (navegador). Então, o que estamos fazendo é, continuamente, pesquisar o servidor através da solicitação AJAX. O pedido funciona como qualquer outro pedido de página, mas a diferença é que você pode solicitar uma página PHP sem recarregar o navegador.

Você pode solicitar a página friend_requests.php em um intervalo de 10 segundos. A página deve fazer o seguinte:

  1. Faça o SQL "SELECT COUNT(*) FROM table_friendship WHERE friend_to = B AND approved = "NO" (Apenas um pseudo-SQL apenas!)
  2. Retorna os seguintes dados: Número de solicitações pendentes e Novas solicitações etc.

No lado do navegador, você pode exibir esses dados na “CAIXA” que você especificou.

Quando você aprovar o pedido, você envia novamente a solicitação AJAX para outra página PHP, para alterar a coluna approved para “SIM”

Mais sobre Ajax – en.wikipedia.org/wiki/Ajax_(programming)

Eu acho que você está procurando por um serviço de notificação push.

Você pode implementar o seu próprio (usando o Comet) ou se inscrever em um serviço público.

Exemplos:

PubNub , BeaconPush

Você encontrará muito mais com o google.

Editar

Acho que minha resposta não foi suficientemente clara. Com a minha sugestão, você poderia fazer isso (usando pubnub):

O usuário B (ID do usuário 7) grava um pedido de amizade para o usuário A (ID do usuário 8). No seu manipulador PHP você faz:

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

Não estou muito acostumado com a php, mas espero que você entenda o que quero dizer.

Na página do Cliente, você pode simplesmente se inscrever no seu canal (‘friend_request_’) e depois lidar com os pedidos:

 // PUBNUB.subscribe() - LISTEN PUBNUB.subscribe({ channel : "friend_request_", callback : function(message) { alert('FRIEND REQUEST FROM USER ID: ' + message.request_from) } }) 

Então, com esta solução, você não terá que lidar com horários ou loops, porque o pubnub lida com isso para você. O Facebook faz isso (tanto quanto eu sei) e o BeaconPush é usado pela EA para o Battlelog, o que, na minha opinião, é um ótimo site com muitas técnicas de Web interessantes.