Chat com Flex e PHP

Exemplo simples de Chat com PHP compartilhado no Google Code.

http://code.google.com/p/flexphpchat/

Funcionamento

O principio de funcionamento deste Chat é bem simples. Quando você clica em conectar ele chama o método buscarMensagem(), que é responsável por buscar as mensagens no servidor. No servidor, o pedido quando recebido, primeiramente ele apaga as mensagens com mais de 10s.

mysql_query("DELETE FROM `mensagem` WHERE `CHAT_DATA`+0 < now()-10;");

Por parâmetro é passado o ultimo CHAT_ID que foi carregado na consulta anterior para que só devolva mensagens após este valor. o método busca_fncOk é responsável pelo gerenciamento dos pedidos que chegam do servidor.

private function busca_fncOk(e:ResultEvent):void
{
    // apresneta as mensagens na area
    // pode vir mais que uma mensagem
    var retorno:Array = e.result as Array;
    // somente chama a função se ouve postagem
    if(retorno != null)
    {
        CHAT_ID = retorno[retorno.length-1]['CHAT_ID'];

        for(var i:int=0; i<retorno.length;i++)
        {
            areaMensagem.htmlText += "<b>" + retorno[i]['CHAT_USUARIO'] + ":</b> " +
                                     retorno[i]['CHAT_MENSAGEM'] + "<br>";
            areaMensagem.validateNow();
            areaMensagem.verticalScrollPosition = areaMensagem.maxVerticalScrollPosition;
        }
    }
    buscarMensagem()
}

Veja que ele recebe um array, e se este array não for nullo é realizado um loop que varre todo este array atrás de novas mensagens. O método validateNow() é executado para que a execução seja pausado até que o layout do TextArea esteja atualizado para assim posicionar a barra de rolagem na base dele.

Quando esta ação é finalizado, uma nova chamada do método buscarMensagem() é invocado, executando esta busca em loop infinito.

O processo de comunicação é baseado em RemoteObject facilitando assim o trabalho de programação.

Configuração

O arquivo services-config.xml

Este arquivo é responsável pela configuração do RemoteObject .

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
	<services>
		<service id="amfphp-flashremoting-service"
		         class="flex.messaging.services.RemotingService"
		         messageTypes="flex.messaging.messages.RemotingMessage">
			<destination id="RemotingMessage">
				<channels>
					<channel ref="my-amfphp"/>
				</channels>
				<properties>
					<source>*</source>
				</properties>
			</destination>
		</service>
	</services>
	<channels>
		<channel-definition id="my-amfphp"
		                    class="mx.messaging.channels.AMFChannel">
			<endpoint uri="RemotingMessage/"
			          class="flex.messaging.endpoints.AMFEndpoint"/>
		</channel-definition>
	</channels>
</services-config>

Veja que em negrito esta destacado o caminho aonde se encontra o amfphp. Você pode alterado a seu critério.

O amfphp

Este é responsável por fazer a comunicação do Flex com o banco de dados. Você poderá sem muito problema implementar este código para qualquer outra linguagem de servidor.

Este amfphp possui algumas alterações que fiz para melhorar seu desempenho e sua segurança. Veja o arquivo original e após as alterações:

Depois das alterações.

Estes arquivos que foram apagados são para sar base ao XMLRPC e ao JSON. Porém como só preciso do AMF, não é necessário ficar armazenando. Renomeei o gateway para index para que a pasta não fique exposta.

PS: quando publicarem não esqueça de apagar a pasta browser.

Na chamada dos métodos, foi adicionado o utf8_decode para evitar problemas com acentuação.

$result = mysql_query(utf8_decode($query));

O banco de dados

As configurações do banco de dados estão dentro do arquivo RemotingMessage/globals.php.

define("DB_HOST", "localhost"); // Host do banco de dados
define("DB_USER", "chat");      // Usuário do banco de dados
define("DB_PASS", "");          // Senha do banco de dados
define("DB_NAME", "chat");      // Banco de Dados

O Código Fonte

Download

O código fonte esta disponível em http://flexphpchat.googlecode.com/files/chat.zip.

SVN

Acesso ao código via Brouser

http://code.google.com/p/flexphpchat/source/browse/

Por linha de Comando

svn checkout http://flexphpchat.googlecode.com/svn/trunk/ flexphpchat-read-only

Fique por dentro de nossas novidades, ideias e atualizações