#1 Le 12/03/2008, à 12:42
- dialloma
Interface de chat avec AJAX et PHP ???
Bonjour à tous,
Je souhaiterai faire une application de chat pour mon site Web. Je voulais le faire en AJAX et du PHP. Donc je souhaiterai savoir quelles parties de PHP (quelq chapitres) interviennent t-ils ? Pour l'AJAX j'utiliserai GWT mais pour la partie serveur, je ne sais pas quels outils utilisés. J'ai vu un tutoriel en PHP sur le site developpez.com qui utilise les SOKETS en PHP; sur le siteduzero.com il y a un mini chat dans la partie PHP qui est fait en PHP+MySQL.
Alors j'aimerai savoir c'est quoi la mailleur façon de faire. La méthode du siteduzero reste quand même simple et facile à mettre en oeuvre que l'autre.
Pour les fonctionnalités:
Je veux afficher la liste de tous les utilisateurs dans un panel à droite. Je veux faire tout simple pour un début juste une fenêtre de chat pour tout le monde. Tout le monde voit tous les messages. Les amélioration viendront après.
Je compte par après créer des salons selon les thèmes, de pouvoir chatter en privé avec quelqu'un etc....
Merci d'avance
Hors ligne
#2 Le 12/03/2008, à 12:54
- aeacides
Re : Interface de chat avec AJAX et PHP ???
Est-ce que tu as déjà programmer en PHP et travailler avec des bases de données?
http://www.q-be.ca
Hors ligne
#3 Le 12/03/2008, à 13:22
- dialloma
Re : Interface de chat avec AJAX et PHP ???
oui je connais assez bien PHP + MySQL. Aussi GWT, java
Hors ligne
#4 Le 12/03/2008, à 14:36
- aeacides
Re : Interface de chat avec AJAX et PHP ???
Ok, donc essaie de découper ton projet en morceaux.
Fait toi un layout xhtml qui correspond à la structure dont tu as besoin.
Pour ta liste d'usager, regarde comment récupérer ta liste à partir de ta DB
etc etc.
Le principe reste le même d'une méthode à l'autre: faire des requêtes périodiques pour voir s'il y a un changement dans la BD et updater la page html.
Je connais pas trop GWT, peut-être il y a des fonctions qui te permette de faire des trucs kewl. Dans mon cas j'utilise plus Prototype et jquery.
Voici un lien qui pourra t'aider pour établir ta structure:
http://www.ajaxprojects.com/ajax/tutori … p?itemid=9
Le seul moyen de vraiment savoir quelle manière est la bonne est de tester. Fait le de la manière que tu crois et voit en testant si des problèmes surgissent (lenteur, bug quelconque ..). Perso ce que je ferais (ayant du temps devant moi) serait de prendre une structure existante, de voir si il y a pas moyen de l'optimiser / l'améliorer et ensuite de coder avec les outils qui te plaisent.
Tu peux même aller jusqu'à faire des test entre différentes librairies javascript et voir ce qui est le plus rapide. J'ai un script en Python qui fait ça, mais tu pourrais facilement le traduire en javascript ou php:
import time
avgIter = 10
iter = 1000000
def timeit(version, funcs):
results = dict(zip([f.__name__ for f in funcs], [0.0] * len(funcs)))
for avgi in range(avgIter):
for func in funcs:
start = time.time()
for i in range(iter):
func(version)
duration = time.time() - start
results[func.__name__] += duration
print '%s - %s: %f' % (func.__name__, version, duration)
print '----- o -----'
for k, v in results.iteritems():
print k, v/avgIter
def fcn1(version):
tXSIVersion = version.split('.')
if int( tXSIVersion[0] ) < 6:
pass
else:
if int( tXSIVersion[1] ) < 5:
pass
def fcn2(version):
tXSIVersion = version.split('.')
if int( tXSIVersion[0] ) < 6 or int( tXSIVersion[1] ) < 5:
pass
def fcn3(version):
tXSIVersion = version.split('.')
if int(tXSIVersion[0]) < 6 or (int(tXSIVersion[0]) == 6 and int(tXSIVersion[1]) < 5):
pass
def fcn4(version):
tXSIVersion = version.split('.')
if tXSIVersion[0] < 6 or (tXSIVersion[0] == 6 and tXSIVersion[1] < 5):
pass
def fcn5(version):
# Form version number that includes only the major and minor version numbers
sVersion = '.'.join( version.split('.')[0:2] )
# Convert this number to float, round it to 2 digits to be sure
fVersion = round( float(sVersion), 2 )
if not fVersion >= 6.5:
pass
if __name__ == '__main__':
funcs = [fcn1, fcn2, fcn3, fcn4, fcn5]
for v in ['6.0', '7.0', '6.5']:
timeit(v, funcs)
Tu peux donc utiliser ça pour optimiser ton code et t'assurer que pour une même action, la librairie que tu utilises sera plus rapide qu'une autre ... mais bon c'est peut-être parano un peu ;- p.
En espérant que ça puisse t'aider
Dernière modification par aeacides (Le 12/03/2008, à 14:49)
http://www.q-be.ca
Hors ligne
#5 Le 12/03/2008, à 17:06
- dialloma
Re : Interface de chat avec AJAX et PHP ???
merci aeacides,
Mais une des questions technique comment gérer la connexion simultannée. L'appli est destinée à étre utilisé par plusieurs "users" en même temps. Je peux utiliser les Sessions en PHP ou bien il y a une autre manière de faire. Enfin je juste envie de savoir quelles techno utilisées. Après je me debrouillerai pour lire la doc si je ne connais pas trop cette dernière.
Merci pour ton code Python.
Pour GWT, c'est un outil qui permet de créer des applis AJAX en restant dans la programmation Java. C'est donc plus facile que d'utiliser le JavaScript entant que tel. GWT produit du HTML et javaScript.
je pourrai faire l'interface graphique et définir ma structure avec GWT. C'est la partie serveur qui m'inquiète. Je suis prenneur de toutes idées là dessus.
Merci
Hors ligne
#6 Le 12/03/2008, à 17:18
- aeacides
Re : Interface de chat avec AJAX et PHP ???
Pour gérer les usagers, tu te fais une table dynamique dans ta BD. Donc a la connexion, il se rajoute dans cette table, et tu gère l'usagers à partir de cette table (ban, statut, etc).
Je me rappel juste pas comment faire pour le retirer si jamais il ferme la fenêtre. J'avais déja vu une classe qui faisait ça. Je cherche et te revient la dessus ...
EDIT
Code tiré de ce site:
http://www.codango.com/php/fnc/content/ … id=7278310
Dans le fond le gars utilise un timeout pour effacer la personne de la bd si jamais ça répond pas.
Il utilise l'ip comme identifiant. Ça peut être bon, mais si t'as plusieurs personne sur le même ip ... c'est peut-être pas mal meilleure solution. Autant prendre l'id de l'usager.
Donc tu fais en sorte que la personne, tant qu'elle est sur la page de chat, update son statut dans la base de donnée dynamique (celle qui répertorie tous les usagers en ligne). Un autre script rouler par tous les usagers regarde si une entré dans la BD est expiré. Si oui alors elle l'efface. Utiliser un timestamp semble être une bonne option.
<?php
$Host = "localhost";
$User = "User";
$PassWord = "PassWord";
$DataBaseName = "DataBaseName";
$TableName = "users";
$TimeOut = 1200; //In seconds.
mysql_connect($Host, $User, $PassWord);
mysql_select_db($DataBaseName);
//This below will create your table for you if it does not exist.
//Feel free to comment it out once the table is created.
$Tables = mysql_query("show tables");
$TableNameExits = false;
while($Table = mysql_fetch_row($Tables))
{
if($Table[0] == $TableName)
$TableNameExits = true;
}
if($TableNameExits == false)
{
$create = "create table " . $TableName .
"(" .
"id int primary key auto_increment, " .
"ip varchar(20), " .
"url varchar(255), " .
"time int " .
")";
mysql_query($create);
}
//This above will create your table for you if it does not exist.
//Feel free to comment it out once the table is created.
$time = time();
//Because of all those users with an ever changing ip address,
//the right-most integer is cut off.
$ip = substr($REMOTE_ADDR, 0, strrpos($REMOTE_ADDR, "."));
$url = $PHP_SELF;
//Is there a record of that user looking at that page?
$select = "select id from " . $TableName .
" where ip = '" . $ip .
"' and url ='" . $url . "'";
$users = mysql_query($select);
if(mysql_num_rows($users) > 0)
{
//If there is, update it.
$update = "update " . $TableName . " set time = " . $time .
" where ip = '" . $ip .
"' and url = '" . $url . "'";
mysql_query($update);
}
else
{
//If not, then add a new one.
$insert = "insert into " . $TableName . " (ip, url, time) values ('" . $ip . "', '" . $url . "', " . $time . ")";
mysql_query($insert);
}
//Get rid of entries that have expired.
$delete = "delete from " . $TableName . " where time < " . ($time - $TimeOut);
mysql_query($delete);
mysql_close();
function users()
{
global $Host;
global $User;
global $PassWord;
global $DataBaseName;
global $TableName;
global $TimeOut;
mysql_connect($Host, $User, $PassWord);
mysql_select_db($DataBaseName);
$select = "select distinct ip from " . $TableName;
$users = mysql_query($select);
$number_of_users = mysql_num_rows($users);
mysql_close();
return($number_of_users);
}
function users_on_this_page()
{
global $Host;
global $User;
global $PassWord;
global $DataBaseName;
global $TableName;
global $TimeOut;
global $url;
mysql_connect($Host, $User, $PassWord);
mysql_select_db($DataBaseName);
$select = "select distinct ip from " . $TableName . " where url = '" . $url . "'";
$users = mysql_query($select);
$number_of_users = mysql_num_rows($users);
mysql_close();
return($number_of_users);
}
?>
Mais bon j'écris tout ça. C'est pas béton je t'avertis. C'est juste des pistes. Fait toi un prototype pour voir si ça peut marcher.
En espérant que ça puisse t'aider
Xavier
Dernière modification par aeacides (Le 12/03/2008, à 17:34)
http://www.q-be.ca
Hors ligne
#7 Le 13/03/2008, à 11:06
- dialloma
Re : Interface de chat avec AJAX et PHP ???
je pense que ça m'aidra. merci encore une fois
Hors ligne