Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Моя статья о создании ajax чата на php.


Автор: Elfet 7.10.2009, 16:38
Приветствую! 

Недавно написал статейку о том как сделать ajax чат на php. 
Ссылка: http://blog.elfet.ru/jquery/php-ajax-chat/

Код

Приветствую!

Эта статья для тех кто желает сам сделать свой чат на php с применением ajax. В ней я расскажу о том как самому сделать простой чат.

Так будет выглядеть получившийся чат.

Необходимые знания:

   1. Начальные знания в php. Такие как: Как подключиться к базе данных mysql?
   2. Начальные знания в html и css.
   3. Начальные знания в JavaScript и jQuery. (даже если вы только слышали о jQuery, но не работали с ним)

Итак начнём!



Для начала создадим новую базу данных в MySQL и выполним SQL запрос:

CREATE TABLE `messages` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `name` char(255) character SET utf8 NOT NULL,
  `text` text character SET utf8,
  PRIMARY KEY  (`id`)
);

В этой таблице у нас будут храниться сообщения чата.

   1. id – номер сообщения, он должен быть помечен как AUTO_INCREMENT для того что бы для каждого сообщения создавался уникальный индекс.
   2. name – имя пользователя отправившего сообщение
   3. text – само сообщение

Можно так же расширить список полей, например время сообщения, и так далее.

Теперь приступим к созданию клиентской части чата. Она у нас будет реализована в файле index.php:

<!-- Указываем DOCTYPE -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>PhpAjaxChat</title>
<!-- У нас всё работает в UTF-8 -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
 
<!-- Загружаем стили для чата -->
<link rel="stylesheet" type="text/css" media="screen" href="css.css" />
 
<!-- Подключаем jQuery -->
<script type="text/javascript" src="jquery.js"></script>
 
<!-- Сам код нашего чата -->
<script type="text/javascript">
 
$(document).ready(function () {
    $("#pac_form").submit(Send); // вешаем на форму с именем и сообщением событие которое срабатывает кодга нажата кнопка "Отправить" или "Enter"
    $("#pac_text").focus(); // по поле ввода сообщения ставим фокус
    setInterval("Load();", 2000); // создаём таймер который будет вызывать загрузку сообщений каждые 2 секунды (2000 миллисекунд)
});   
 
// Функция для отправки сообщения
function Send() {
    // Выполняем запрос к серверу с помощью jquery ajax: $.post(адрес, {параметры запроса}, функция которая вызывается по завершению запроса)
    $.post("ajax.php", 
        {
        act: "send",  // указываем скрипту, что мы отправляем новое сообщение и его нужно записать
        name: $("#pac_name").val(), // имя пользователя
        text: $("#pac_text").val() //  сам текст сообщения
    },
     Load ); // по завершению отправки вызываем функцию загрузки новых сообщений Load()
 
    $("#pac_text").val(""); // очистим поле ввода сообщения
    $("#pac_text").focus(); // и поставим на него фокус
 
    return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится
}
 
var last_message_id = 0; // номер последнего сообщения, что получил пользователь
var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем
 
// Функция для загрузки сообщений
function Load() {
    // Проверяем можем ли мы загружать сообщения. Это сделано для того, чтобы мы не начали загрузку заново, если старая загрузка ещё не закончилась.
    if(!load_in_process)
    {
            load_in_process = true; // загрузка началась
            // отсылаем запрос серверу, который вернёт нам javascript
            $.post("ajax.php",
            {
                  act: "load", // указываем на то что это загрузка сообщений
                  last: last_message_id, // передаём номер последнего сообщения который получил пользователь в прошлую загрузку
                  rand: (new Date()).getTime()
            },
               function (result) { // в эту функцию в качестве параметра передаётся javascript код, который мы должны выполнить
                    eval(result); // выполняем скрипт полученный от сервера
                    $(".chat").scrollTop($(".chat").get(0).scrollHeight); // прокручиваем сообщения вниз
                    load_in_process = false; // говорим что загрузка закончилась, можем теперь начать новую загрузку
            });
    }
}
</script>
 
<body>
<div style="padding: 100px;">
<h1>Php Ajax Chat</h1>
<!-- Вот в этих 2-х div-ах будут идти наши сообщения из чата -->
<div class="chat r4">
<div id="chat_area"><!-- Сюда мы будем добавлять новые сообщения --></div>
</div>
<form id="pac_form" action=""><!-- Наша форма с именем, сообщением и кнопкой для отправки -->
<table style="width: 100%;">
        <tr>
                <td>Имя:</td>
                <td>Сообщение:</td>
                <td></td>
        </tr>
        <tr>
                <!-- Поле ввода имени -->
                <td><input type="text" id="pac_name" class="r4" value="Гость"></td>
 
                <!-- Поле ввода сообщения -->
                <td style="width: 80%;"><input type="text" id="pac_text" class="r4" value=""></td>
 
                <!-- Кнопка "Отправить" -->
                <td><input type="submit" value="Отправить"></td>
        </tr>
</table>
</form>
 
</div>
</body>
</html>

css.css:

* {
        margin: 0;
        padding: 0;
}
 
body {
        font: normal normal normal 16px "Trebuchet MS", Arial, Times;
        color: #000000;
}
 
/* Важное свойство */
.chat {
        height: 500px;
        overflow: auto; /* Это позволяет отображать полосу прокрутки */
        position: relative; /* Это позволяет съезжать тексту в слое, не растягивая страницу */
        text-align: left;
        border: solid #818181 1px;
}
 
.chat div {
        position: absolute; /* Страница остаётся того же размера */
}
 
.chat span {
        display: block;
}
 
input[type=text],textarea {
        width: 100%;
        font: normal normal normal 16px "Trebuchet MS", Arial, Times;
        border: solid #818181 1px;
}
 
/* Для CSS 3 */
.r4 {
        -moz-border-radius: 4px;
        -khtml-border-radius: 4px;
        -webkit-border-radius: 4px;
        border-radius: 4px;
}

Теперь приступим к созданию серверной части чата ajax.php:

<?php
// настройки для подключения к MySQl
$config = array( 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'dbname' => 'pacdb' );
 
// подключаемся к MySQL, если не вышло то выходим
if( !mysql_connect($config['hostname'], $config['username'], $config['password']) )
{
        exit();
}
// Выбираем базу данных, если не вышло то выходим
if( !mysql_select_db($config['dbname']) )
{
        exit();
}
mysql_query("SET NAMES 'utf8'"); // говорим MySQl'у то что мы будем работать с UTF-8
 
Header("Cache-Control: no-cache, must-revalidate"); // говорим браузеру что-бы он не кешировал эту страницу
Header("Pragma: no-cache");
 
Header("Content-Type: text/javascript; charset=utf-8"); // говорим браузеру что это javascript в кодировке UTF-8
 
// проверяем есть ли переменная act (send или load), которая указываем нам что делать
if( isset($_POST['act']) )
{
        // $_POST['act'] - существует
        switch ($_POST['act'])
        {
                case "send" : // если она равняется send, вызываем функцию Send()
                        Send();
                        break;
                case "load" : // если она равняется load, вызываем функцию Load()
                        Load();
                        break;
                default : // если ни тому и не другому  - выходим
                        exit();
        }
}
 
// Функция выполняем сохранение сообщения в базе данных
function Send()
{
        // тут мы получили две переменные переданные нашим java-скриптом при помощи ajax
        // это:  $_POST['name'] - имя пользователя
        // и $_POST['text'] - сообщение
 
        $name = substr($_POST['name'], 0, 200); // обрезаем до 200 символов
        $name = htmlspecialchars($name); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
        $name = mysql_real_escape_string($name); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
 
        $text = substr($_POST['text'], 0, 200); // обрезаем до 200 символов
        $text = htmlspecialchars($text); // заменяем опасные теги (<h1>,<br>, и прочие) на безопасные
        $text = mysql_real_escape_string($text); // функция экранирует все спец-символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
 
        // добавляем новую запись в таблицу messages
        mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')");
}
 
 
// функция выполняем загрузку сообщений из базы данных и отправку их пользователю через ajax виде java-скрипта
function Load()
{
        // тут мы получили переменную переданную нашим java-скриптом при помощи ajax
        // это:  $_POST['last'] - номер последнего сообщения которое загрузилось у пользователя
 
        $last_message_id = intval($_POST['last']); // возвращает целое значение переменной
 
        // выполняем запрос к базе данных для получения 10 сообщений последних сообщений с номером большим чем $last_message_id
        $query = mysql_query("SELECT * FROM messages WHERE ( id > $last_message_id ) ORDER BY id DESC LIMIT 10");
 
        // проверяем есть ли какие-нибудь новые сообщения
        if( mysql_num_rows($query) > 0 )
        {
                // начинаем формировать javascript который мы передадим клиенту
                $js = 'var chat = $("#chat_area");'; // получаем "указатель" на div, в который мы добавим новые сообщения
 
                // следующий конструкцией мы получаем массив сообщений из нашего запроса
                $messages = array();
                while ( $row = mysql_fetch_array($query) )
                {
                        $messages[] = $row;
                }
 
                // записываем номер последнего сообщения
                // [0] - это вернёт нам первый элемент в массиве $messages, но так как мы выполнили запрос с параметром "DESC" (в обратном порядке),
                // то это получается номер последнего сообщения в базе данных
                $last_message_id = $messages[0]['id'];
 
                // переворачиваем массив (теперь он в правильном порядке)
                $messages = array_reverse($messages);
 
                // идём по всем элементам массива $messages
                foreach ( $messages as $value )
                {
                        // продолжаем формировать скрипт для отправки пользователю
                        $js .= 'chat.append("<span>' . $value['name'] . '&raquo; ' . $value['text'] . '</span>");'; // добавить сообщние (<span>Имя &raquo; текст сообщения</span>) в наш div
                }
 
                $js .= "last_message_id = $last_message_id;"; // запишем номер последнего полученного сообщения, что бы в следующий раз начать загрузку с этого сообщения
 
                // отправляем полученный код пользователю, где он будет выполнен при помощи функции eval()
                echo $js;
        }
}
?>

Чат готов!

Автор: bars80080 7.10.2009, 17:37
у тебя страница разлетелась в ИЕ7 в пух и прах

Автор: Elfet 7.10.2009, 19:14
Да, точно, подправил.  smile

Автор: bars80080 8.10.2009, 10:18
по смыслу не могу сказать, только по оформлению

Цитата

<div style="padding: 100px;">
<table style="width: 100%;">
очень плохой тон учить такому, тем более что стили далее представлены

Цитата

if( !mysql_connect($config['hostname'], $config['username'], $config['password']) )
{
        exit();
}
// Выбираем базу данных, если не вышло то выходим
if( !mysql_select_db($config['dbname']) )
{
        exit();
}
желательно было бы дописать хоть какие-то сообщения об ошибках, иначе юзер долго будет пялиться в пустой экран

Цитата
                case "send" : // если она равняется send, вызываем функцию Send()
                        Send();
совершенно бессмысленный комментарий. выхов функции итак видно, а лишний текст только напрягает

Цитата
        $name = mysql_escape_string($name); // функция экранирует все спец-
символы в unescaped_string , вследствие чего, её можно безопасно использовать в mysql_query()
уже довольно давно используют mysql_real_escape_string, признав mysql_escape_string не совсем корректной

Цитата

        mysql_query("INSERT INTO messages (name,text) VALUES ('" . $name . "', '" . $text . "')");
судя по этому запросу, возникает ощущение, что именно этот код не тестировался. этот запрос выдаст ошибку

вообще, довольно плохой тон пихать запросы прямо в функцию. если вы кого хотите чему-то научить, то нужно стараться продемонстрировать наиболее корректный код. в особенности с точки зрения отладки

Цитата
                // начинаем формировать java-скрипт который мы передадим клиенту
слово javascript надо либо переводить полностью, либо не переводить вообще, иначе получается что мы говорим о скриптах языка java


Автор: NewDima 8.10.2009, 10:28
Собственно, где там статья? Там только код, не считая вступления. Конечно комменты есть, но это не помогает учащемуся понять алгоритм

Автор: youri 8.10.2009, 10:47
Цитата(bars80080 @  8.10.2009,  10:18 Найти цитируемый пост)
уже довольно давно используют mysql_real_escape_string, признав mysql_escape_string не совсем корректной

а в чем именно некорректность?

Автор: NewDima 8.10.2009, 11:48
youri, видно слишком вольный перевод слова depricated

Автор: Elfet 8.10.2009, 11:58
Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
очень плохой тон учить такому, тем более что стили далее представлены

Да, возможно. Суть статьи не в этом smile



Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
желательно было бы дописать хоть какие-то сообщения об ошибках, иначе юзер долго будет пялиться в пустой экран

Думаю что это каждый может сообразить smile



Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
совершенно бессмысленный комментарий. выхов функции итак видно, а лишний текст только напрягает

В нём глубокий, скрытый смысл  smile 

Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
уже довольно давно используют mysql_real_escape_string, признав mysql_escape_string не совсем корректной

Я вообще обычно использую плейсхолдеры. Забыл про этот _real_ 



Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
судя по этому запросу, возникает ощущение, что именно этот код не тестировался. этот запрос выдаст ошибку

Какая интересно ошибка? smile
Кстати как я получил принт-скрин? 



Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
вообще, довольно плохой тон пихать запросы прямо в функцию. если вы кого хотите чему-то научить, то нужно стараться продемонстрировать наиболее корректный код. в особенности с точки зрения отладки

Думаю тут это излишне. 

Цитата(bars80080 @  8.10.2009,  11:18 Найти цитируемый пост)
слово javascript надо либо переводить полностью, либо не переводить вообще, иначе получается что мы говорим о скриптах языка java

Да, точно это нужно исправить  smile 



Цитата(NewDima @  8.10.2009,  11:28 Найти цитируемый пост)
Собственно, где там статья? Там только код, не считая вступления. Конечно комменты есть, но это не помогает учащемуся понять алгоритм 

Это и есть статья. Нет, конечно же можно вынести комменты из кода, разбив сам код на кучу раздельных строк  smile 



Цитата(youri @  8.10.2009,  11:47 Найти цитируемый пост)
а в чем именно некорректность? 

mysql_real_escape_string правильно работает с многобайтовыми кодировками.

Автор: youri 8.10.2009, 12:34
Цитата(Elfet @  8.10.2009,  11:58 Найти цитируемый пост)
mysql_real_escape_string правильно работает с многобайтовыми кодировками.

да и я, в общем-то согласен, что mysql_real_escape_string лучше использовать, но не обязательно. Можно почитать вот http://phpclub.ru/talk/showthread.php?postid=868194#post868194

Автор: bars80080 8.10.2009, 14:34
Цитата(Elfet @  8.10.2009,  11:58 Найти цитируемый пост)
Какая интересно ошибка? 
Кстати как я получил принт-скрин? 

не верю что он работал именно в таком виде. слово text - служебное и его надо выделять апострофами

Автор: 02077461 8.10.2009, 14:57
Я уже забыть успел что такое запросы. Работаю на symfony+doctrine, переходил с небольшим скрипом, но зато когда почувствовал что это действительно дает -- не могу оторваться. 
Обсуждение правильности запроса и использование real_escape... для меня это во вчерашнем дне. Очень рекомендую. 
Использование фреймворка дает много плюсов, может быть стоит начать его использовать?

Автор: NewDima 8.10.2009, 15:02
Цитата(02077461 @ 8.10.2009,  21:57)
Я уже забыть успел что такое запросы.

Представляю,с какогй скоростью у тебя работают и без конструктора сложные запросы.

Автор: youri 8.10.2009, 15:09
Цитата(02077461 @  8.10.2009,  14:57 Найти цитируемый пост)
но зато когда почувствовал что это действительно дает -- не могу оторваться

все зависит от задач (http://phpclub.ru/talk/showthread.php?postid=843576#post843576)

Автор: Elfet 8.10.2009, 15:39
Цитата(bars80080 @  8.10.2009,  15:34 Найти цитируемый пост)
не верю что он работал именно в таком виде. слово text - служебное и его надо выделять апострофами 

Представь себе работает.  smile 

Автор: nerezus 9.10.2009, 09:25
Код совершенно не понравился.
Комментировать код не умеем: додумался комментировать даже синтаксис, типа циклов.
много лишнего кода, например считывание из базы в массив.
Незнание синтаксиса SQL и обход незнания через array_reverse.

Цитата

Представляю,с какогй скоростью у тебя работают и без конструктора сложные запросы.
 А в чем проблема то?

Не понравилась спичечная "типа оптимизация"(прирост ибо 0%) конкатенации строки в ухудшение читаемости.

Автор: MoLeX 9.10.2009, 10:40
Цитата(nerezus @  9.10.2009,  09:25 Найти цитируемый пост)
Код совершенно не понравился.
Комментировать код не умеем: додумался комментировать даже синтаксис, типа циклов.
много лишнего кода, например считывание из базы в массив.
Незнание синтаксиса SQL и обход незнания через array_reverse.


+

1. если у тебя и твой чат так построен то за что тебе деньги платят (за такой код мне лично жалко платить)?!
2. Если размещаешь статью, то размещай её на форуме

Автор: Elfet 12.10.2009, 17:10
Цитата(nerezus @  9.10.2009,  10:25 Найти цитируемый пост)
много лишнего кода, например считывание из базы в массив.

Нет, совсем не лишний. 

Цитата(nerezus @  9.10.2009,  10:25 Найти цитируемый пост)
Незнание синтаксиса SQL и обход незнания через array_reverse.

Нет, синтаксис построен так как мне удобно было бы объяснить работу кода. 

Цитата(nerezus @  9.10.2009,  10:25 Найти цитируемый пост)
Не понравилась спичечная "типа оптимизация"(прирост ибо 0%) конкатенации строки в ухудшение читаемости. 

"типа" я не понял про что вы?

Цитата(MoLeX @  9.10.2009,  11:40 Найти цитируемый пост)
1. если у тебя и твой чат так построен то за что тебе деньги платят (за такой код мне лично жалко платить)?!

Мне платят за работу которую я проделал при проектировании, программировании и кодировании чата.

Цитата(MoLeX @  9.10.2009,  11:40 Найти цитируемый пост)
2. Если размещаешь статью, то размещай её на форуме 

MoLeX, скопировал. 

Автор: nerezus 12.10.2009, 18:27
Цитата

Нет, синтаксис построен так как мне удобно было бы объяснить работу кода. 
 "Ну и что, что код через задницу, так его объяснять удобнее?"
Неужели?

Автор: Elfet 12.10.2009, 18:42
nerezus, я не вижу причин тому что бы называть мой код "через задницу".

Автор: nerezus 12.10.2009, 19:15
google://ORDER BY

Автор: bars80080 12.10.2009, 19:32
Цитата(nerezus @  12.10.2009,  19:15 Найти цитируемый пост)
google://ORDER BY 

наверно, что-то умное

Автор: Elfet 12.10.2009, 20:06
Вы что, неужели думаете что я не знаю что такое ASC и DESC?  

По тому что вы увидели у меня  в коде только DESC|array_reverse и не поняли зачем это, я могу судить о том что вы ещё мало разбираетесь в программировании вообще и в кодинге на php. 

Автор: solenko 12.10.2009, 20:12
Цитата(Elfet @  12.10.2009,  19:06 Найти цитируемый пост)
По тому что вы увидели у меня  в коде только DESC|array_reverse и не поняли зачем это

Я как бы тоже не понял. Поделитесь таинством?

Добавлено через 4 минуты и 10 секунд
Цитата(Elfet @  7.10.2009,  15:38 Найти цитируемый пост)
 
Код

foreach ( $messages as $value )
                {
                        // продолжаем формировать скрипт для отправки пользователю
                        $js .= 'chat.append("<span>' . $value['name'] . '&raquo; ' . $value['text'] . '</span>");'; // добавить сообщние (<span>Имя &raquo; текст сообщения</span>) в наш div
                }

А зечем много раз дергать DOM дерево? Почему не собрать одну строку и не аппендить ее один раз?

Автор: Elfet 12.10.2009, 21:20
Цитата(solenko @  12.10.2009,  21:12 Найти цитируемый пост)
А зечем много раз дергать DOM дерево? Почему не собрать одну строку и не аппендить ее один раз?

Тут согласен. Можно сделать и так, возможно это даже лучше когда у нас 10000 сообщений за раз приходит, однако больше 10 у меня за раз прийти не может, так что я думаю тут это не критично.



Цитата(solenko @  12.10.2009,  21:12 Найти цитируемый пост)
Я как бы тоже не понял. Поделитесь таинством?

Дело в том что иначе усложняется SQL запрос для выбора последних N сообщений.

Автор: solenko 13.10.2009, 00:53
Код

SELECT * FROM messages WHERE ( id > $last_message_id ) ORDER BY id DESC LIMIT 10

А что будет если пользователи будут писать более 10 ссобщений в 2 секунды? Пользователь никогда не увилит актуальное состояние чата? Зачем вообще нужел limit? 
Цитата(Elfet @  12.10.2009,  20:20 Найти цитируемый пост)
Дело в том что иначе усложняется SQL запрос для выбора последних N сообщений.

Я сразу и внимания то не обратил. Вопросы по этому поводу выше.

Автор: MoLeX 13.10.2009, 08:53
Цитата(solenko @  13.10.2009,  00:53 Найти цитируемый пост)
А что будет если пользователи будут писать более 10 ссобщений в 2 секунды? Пользователь никогда не увилит актуальное состояние чата? Зачем вообще нужел limit? 

точно. я даже и не обратил внимание. 

Автор: Elfet 13.10.2009, 15:55
solenko, более 10 сообщений в 2 секунды - это уже спам, это не нужно добавлять в базу уже. 

А LIMIT 10 нужен затем что бы при первой загрузке не показывать пользователю всю базу целиком, а только последние 10 сообщений.

Автор: nerezus 13.10.2009, 20:55
Elfet, 
Цитата

Дело в том что иначе усложняется SQL запрос для выбора последних N сообщений.
 нисколько не усложняется.

Цитата

А LIMIT 10 нужен затем что бы при первой загрузке не показывать пользователю всю базу целиком, а только последние 10 сообщений.
 Первый раз можно установить эту переменную в необходимое значение.

Автор: Elfet 13.10.2009, 21:25
Цитата(nerezus @  13.10.2009,  21:55 Найти цитируемый пост)
 Первый раз можно установить эту переменную в необходимое значение. 

В своей реализации я решил сделать именно так, так как мне кажется для объяснения принципов лучше, а нагружать код всякими излишними наворотами не нужно.

Добавлено через 2 минуты и 48 секунд
Используя DESC и LIMIT я убил двух зайцев - начальную инициализацию (загрузку последних 10 сообщений, получение id последнего сообщения) и подгрузку новых сообщений.

Автор: solenko 14.10.2009, 09:39
Цитата(Elfet @  13.10.2009,  14:55 Найти цитируемый пост)
solenko, более 10 сообщений в 2 секунды - это уже спам, это не нужно добавлять в базу уже. 

1. А цифры вы инженерно-потолочным способом определяли?
2. Даже если это спам, то данные все равно будут вставлятся в базу, а вот полезное сообщение, полученное после него, пользователь не увидит
3. Вы или не застал эпоху чатов, либо просто никогда не бывали на популярном чате. Такое количество сообщений -- мелочи

Добавлено через 2 минуты и 48 секунд
Цитата(Elfet @  13.10.2009,  20:25 Найти цитируемый пост)
В своей реализации я решил сделать именно так, так как мне кажется для объяснения принципов лучше, а нагружать код всякими излишними наворотами не нужно.

Как раз таки для учебного процесса лучше объяснить, что инициализация чата и получение сообщений -- разные подзадачи

Добавлено через 3 минуты и 58 секунд
Цитата(Elfet @  13.10.2009,  20:25 Найти цитируемый пост)
Используя DESC и LIMIT я убил двух зайцев - начальную инициализацию (загрузку последних 10 сообщений, получение id последнего сообщения) и подгрузку новых сообщений.

нет, вы убили других двух зайцев: внесли ненужные ограничения на функционал и сделали код нелогичным

Автор: Elfet 14.10.2009, 09:52
Цитата(solenko @  14.10.2009,  10:39 Найти цитируемый пост)
1. А цифры вы инженерно-потолочным способом определяли?

Вы знаете другой способ? 


Цитата(solenko @  14.10.2009,  10:39 Найти цитируемый пост)
2. Даже если это спам, то данные все равно будут вставлятся в базу, а вот полезное сообщение, полученное после него, пользователь не увидит

Нет, УВИДИТ! Если за 2-е секунды пришло больше 10 сообщений, то сначала он получит первые 10, а затем, в следующую загрузку остальные. 

Цитата(solenko @  14.10.2009,  10:39 Найти цитируемый пост)
3. Вы или не застал эпоху чатов, либо просто никогда не бывали на популярном чате. Такое количество сообщений -- мелочи

Эпоху чатов застал. Но никогда не общался в чате с таким напором сообщений.


Цитата(solenko @  14.10.2009,  10:39 Найти цитируемый пост)
Как раз таки для учебного процесса лучше объяснить, что инициализация чата и получение сообщений -- разные подзадачи

По моему мнению - нет, не нужно. 

Цитата(solenko @  14.10.2009,  10:39 Найти цитируемый пост)
нет, вы убили других двух зайцев: внесли ненужные ограничения на функционал и сделали код нелогичным 

Какие ограничения? Совершенно логичным. 

Автор: MoLeX 14.10.2009, 17:49
Цитата(Elfet @  13.10.2009,  15:55 Найти цитируемый пост)
более 10 сообщений в 2 секунды - это уже спам, это не нужно добавлять в базу уже. 

да, а если на чате сидит 1000 человек и интенсивно общаются, то в 1-сек будет куда больше 10 мессаг

Автор: Elfet 14.10.2009, 19:21
MoLeX, навряд ли одни общаются каждый с каждым. Если этот чат больше походит на чат один к одному, то тут лучше использовать демона и долгие опросы (long poll)

Автор: holms 7.11.2009, 23:35
Хорошая статья, все принципы работы чата понятны, возьму как основу и доделаю. Большой респект автору за jquery, так как основной фреймворк на сайте =)

Автор: gcc 28.3.2010, 18:41
а как на счет websockets и push server, long-pull, aka Comet  ?

стоит ли заморачиватся с этими двумя или делать на аяксе обычном?

1) http://habrahabr.ru/blogs/webdev/79038/
2) http://javascript.ru/ajax/comet/overview и http://habrahabr.ru/blogs/webdev/41223/ 
 

Автор: Elfet 28.3.2010, 21:27
gcc, смотря что вам нужно. Если у вас только виртуальный хостинг, то ничего кроме аякса у вас пока не будет работать. Если же свой сервер то конечноже comet (long pulling) является желательным. 

В новой версии моего чата можно выбирать то на чём он будет работать, на простом аяксе (частые опросы) или на comet (длинные запросы).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)