|
|
|
| Всем привет!
При входе в чат пользователя в базу заносится id - номер; login - логин; password - пароль;
email - почта; status - статус; nexttime - время входа; thistime - время последнего обращения к серверу; active - 1/0 активность; chasov - кол-во часов проведенных в чате; hitov - кол-во написанных сообщений.
Когда фреймы загружены, то во фрейме users.php происходит постоянное обращение к файлу gousers.php (раз в секунду c помощью аякса) его код ниже. В этом файле данному пользователю выставляется текущее время и в цикле проходит всех остальных пользователей чата и у них также проверяет активность (разность текущего времени и времени последнего обращения к файлу). Если активность подтверждаетсято он выводится, если нет то в полю active присваивается 0 (это поле создано для того чтобы потом еще делать проверку на то, был ли данный ник активен при прошлом обращении к файлу, чтобы во фрейм сообщений выводить надпись о выходе его из чата)
<?php
/*забираем в переменные логин и пороль данного пользователя*/
session_start();
$thislogin = $_SESSION['login'];
$thispassword = $_SESSION['password'];
/* подключаемся к базе */
header("Content-type: text/html; charset=Windows-1251");
include("includer.php");
$db = mysql_connect($myserver, $mylogin, $mypassword);
$ll = mysql_select_db('users',$db);
$cifra = 1;
$necifra = 0;
/* данному пользователю выставляем текущее время*/
$sql="SELECT * FROM `chat_users` WHERE `login`='".$thislogin."' and `password`='".$thispassword."'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);
$time = time();
$id= $row["id"];
$login = $row["login"];
$password = $row["password"];
$email = $row["email"];
$status = $row["status"];
$ip = $row["ip"];
$nexttime = $row["nexttime"];
$chasov = $row["chasov"];
$hitov = $row["hitov"];
$sql="DELETE FROM `chat_users` WHERE `id`=".$id;
$result=mysql_query($sql);
$sql="INSERT INTO `chat_users` VALUES ('".$id."','".$login."', '".$password."', '".$email."', '".$status."', '".$ip."', '".$cifra."','".$nexttime."','".$time."','".$chasov."','".$hitov."')";
$result=mysql_query($sql);
/*забираем в маасив mas все логины из базы */
$mas = array()
$i = 1;
$query = "SELECT * FROM 'chat_users' ORDER BY login";
$ath = mysql_query($query);
if(!$ath) exit("<p>Ошибка в запросе к таблице сессий</p>");
if(mysql_num_rows($ath)>0)
{
while($author = mysql_fetch_array($ath))
{
$mas[$i] = $author['login'];
$i = $i+1;
}
}
/*проверяем каждый ник в базе на проявление активности*/
for ($j = 1; $j < $i; $j++)
{
$login = $mas[$j];
$sql="SELECT * FROM `chat_users` WHERE `login`='".$login."'";
$result=mysql_query($sql);
$row=mysql_fetch_array($result);
$id= $row["id"];
$login = $row["login"];
$password = $row["password"];
$email = $row["email"];
$status = $row["status"];
$ip = $row["ip"];
$nexttime = $row["nexttime"];
$thistime = $row["thistime"];
$chasov = $row["chasov"];
$hitov = $row["hitov"];
$otvet = $time - $thistime;
/*если пользователь активен, то выводим его*/
if ($otvet < 3)
{
echo $login;
echo "<br>";
}
/*если пользователь неактивен, то ставим ему в активность 0*/
else
{
$sql="DELETE FROM `chat_users` WHERE `login`=".$login;
$result=mysql_query($sql);
$sql="INSERT INTO `chat_users` VALUES ('".$id."','".$login."', '".$password."', '".$email."', '".$status."', '".$ip."', '".$necifra."','".$nexttime."','".$thistime."','".$chasov."','".$hitov."')";
$result=mysql_query($sql);
}
}
?>
|
В этом коде гдето ошибка, не могу найти где. | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 10:34)
| | В чём проявляется ошибка? Выводятся ли какие-либо сообщения? | |
|
|
|
|
|
|
|
для: cheops
(17.05.2007 в 10:55)
| | нет, фрейм остается пустым | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 10:34)
| | скрипт гробит процессорное время (апача и mysql-сервера), гробит трафик (сервера и пользователей). Причем так, что пользователи разбегаются, а хостер (если это, конечно, не личный сервер) присылает предупреждение о превышении квот.
а вот эта мантра (Когда фреймы загружены, то во фрейме users.php происходит постоянное обращение к файлу gousers.php (раз в секунду c помощью аякса) его код ниже. В этом файле данному пользователю выставляется текущее время и в цикле проходит всех остальных пользователей чата и у них также проверяет активность (разность текущего времени и времени последнего обращения к файлу). Если активность подтверждаетсято он выводится, если нет то в полю active присваивается 0 (это поле создано для того чтобы потом еще делать проверку на то, был ли данный ник активен при прошлом обращении к файлу, чтобы во фрейм сообщений выводить надпись о выходе его из чата))
выедает моск. Начисто. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 11:21)
| | У меня выделенный, поэтому все норм будет =)
Процессор Pentium-4 2.4 ГГц
Оперативная память 1024 Мб
Жёсткий диск IDE HDD RAID1 2x80 Гб
Лимит трафика 1000 Гб
И фрейм с сообщениями работает примерно по такомуже принципу и с трафиком тоже нормально всё. | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 11:31)
| | Просто я хочу сделать действительно хороший быстрый чат. Ставка делается на скорость! | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 11:32)
| | Вот если делаете ставку на скорость - так и скрипт пишите так, чтобы он не выполнял одно и то же по двадцать раз, когда можно обойтись одним.
И еще.... в SQL есть такая команда "UPDATE" . В подавляющем большинстве случаев работает она быстрее, чем INSERT/DELETE . И транзакционных проблем не создает.
А вообще, это насчет скоростных чатов - в котором в реальном времени видно. как пятнадцать человек печатают буковки фраз. | |
|
|
|
|
|
|
|
для: Trianon
(17.05.2007 в 11:36)
| | Вы можете сказать видите ли вы ошибки в коде. | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 12:10)
| | Всё, разобрался, работает =) | |
|
|
|
|
|
|
|
для: Kreg-Heg
(17.05.2007 в 11:32)
| | >Просто я хочу сделать действительно хороший быстрый чат. Ставка делается на скорость!
Действительно хороший быстрый чат, надо делать с использованием Ajax. С рефрешом такой не получится. | |
|
|
|
|
|
|
|
для: Temnovit
(17.05.2007 в 13:10)
| | прочитайте первый пост внимательнее, у него всё на аяксе | |
|
|
|