сделано по мотивам ajax бд на файлах от Luge http://e-luge.net/blog/full/baa73303.html и новой лицензии GPL\хуи придуманной совместно с Apple как работает смотреть тут http://www.ananastelecom.ru/chat/ скачать тут http://www.ananastelecom.ru/chat.zip и пару классов на троллинг PHP: <? class Сhat{ public static $user_name = null; /** * Добавляет строку в файл чата * @var string */ public static function add_message($var){ $file = file(CHAT_PATH); if(count($file)>CHAT_MAX_ROW){ unset($file[0]); } array_push($file,$var."\r\n"); $fp = fopen(CHAT_PATH, "w"); fputs($fp, implode("", $file)); fclose($fp); } /** * Читает чат из файла * @return mixed */ public static function get_chat(){ return file_get_contents(CHAT_PATH); } /** * Обновляет\записывает юзеров в бд * @var $name имя пользователя * @var $db объект бд */ public static function update_users($name,$db){ $user_hash = md5($_SERVER["HTTP_USER_AGENT"].$_SERVER['REMOTE_ADDR']); //ищем нашего юзера $find = array( 'from'=>'users', 'fields' => '*', 'where' => array( 'key' => 'userhash', 'val' => $user_hash, 'type' => 'eq'), 'num' => '1'); $r = $db->select($find); //если есть обновляем ему имя и время if ($r) { $id = $r[0]['idx']; $update = array( 'from' => 'users', 'update' => array('name' => $name, 'time' => time()), 'whereId'=> $id ); $db->update($update); } else { //если нет то записываем $insert = array( 'userhash' => $user_hash, 'name' => $name, 'time' => time() ); $db->insert('users',$insert); } } /** * Вытаскивает всех юзеров и обертывает в html * @var $db объект бд * @return mixed */ public static function get_users($db){ $find = array( 'from'=>'users', 'fields' => '*', 'where' => array( 'key' => '', 'val' => '', 'type' => 'con'), 'num' => 'all'); $r = $db->select($find); if ($r) { foreach ($r as $v) { $v = $v['res']; echo '<div class="user">'.$v['name'].'</div>'; } } } /** * Удаляет вышедших юзеров * @var $db объект бд * @var $max_save_time максимальное время бездействия */ public static function delete_users($db,$max_save_time){ $time = time(); $find = array( 'from'=>'users', 'fields' => '*', 'where' => array( 'key' => '', 'val' => '', 'type'=> 'con'), 'num' => 'all'); $r = $db->select($find); if ($r) { foreach ($r as $v) { $v = $v['res']; $user_hash=$v['userhash']; $time_to_delete = $v['time'] + 60; if($time_to_delete < $time){ $delete = array( 'from' => 'users', 'where' => array( 'key' => 'userhash', 'val' => $user_hash, 'type' => 'eq') ); $db->delete($delete); } } } } /*** * приводит входящик данные к нужному виду * * @var $var входящая переменная * @var $length максимальная длинна переменной * @var $default переменная по умолчанию */ public static function validator($var,$length,$default){ $var = substr($var, 0, $length); if($var == ''){ $var = $default; } return htmlspecialchars($var); } } PHP: <? class Parser { /** * Имя пользователя. * @var string */ protected $user_name = null; /** * Массив со смайлами и путями к ним. * @var array */ protected $smiles_array = array(); /** * Конструктор */ public function __construct($name,$message,$smiles) { $this->smiles_array = $smiles; $this->user_name = $name; $this->user_message = $message; } /** * Удаление нежелательных символов и обрезание * до нужной длинны * @param string $text переменная для обработки * @param string $length максимальная длинна переменной. * @return string */ /** * Заменяет подстроку на картинку смайлика * * @return string */ public function set_smiles(){ foreach ($this->smiles_array as $key => $value ){ $this->user_message = str_replace($key, "<img src='".$value."'>", $this->user_message); } } /** * Формирует строку сообщения * * @return string */ public function build_string(){ return '<span class="chat_string">'.'['.date("H:i:s").']'.'['.$this->user_name.'] '.$this->user_message.'</span><br/>'; } }
Если уж говорить об ООП, то чат, по сути, является отдельной сущностью. Чат имеет список сообщений, т.е объект MessageList, содержащий объект Message, который в свою очередь содержит атрибуты Author, Date, Text и методы Remove, Change. MessageList получает сообщения из списка и представляет их в виде объектов. Объект Chat оперирует с объектом MessageList, который имеет методы Push, Remove, RemoveLine, GetMessageById, Update. Упрощенная модель, но это по части ООП =) Насчет кодировки и других мелочей я тебе уже сказал в чате. Всё, я кончил.
Apple ясно, в следующий раз сделаю правильно, надо только придумать что писать) это что объект в объект передавать надо будет? а в чате не смог даже соблазниться
Апельсин сам в шоке.. ты чего там на шаманил?))) ммм, а во всех чатах так, нет разве? или кнопку надо поставить "не обновлять" ?
Kreker не, это новое расширение для любой лицензии учить этим инструментом можно, но лучше наказывать
Я не знаю как там во всех чатах... Кнопка "не обновлять" на мой чисто субъективный взгляд не лучшая идея.... Надо чтоб он дописывал в конец, но не менял положение арии с чатом. Или на худой конец, обновлял только при появлении новых сообщений. Или сделать основное окно не прокручиваемым (но растянуть по высоте) и сделать отдельную кнопку "посмотреть историю".
еххх еше бы Luge добавил встроенный order by и поправил delete по индексу цены бы этой штуке не было... но он куда то пропал :\ мне тут сказали что если бд на файлах, то я насилую винт, правда насилую или нет?^^
Я на txtsql делал первый сайт (точнее самый первый был вообще на кучке txt, а этот первый с каким никаким скулем) - вполне работало. Но при частых запросах пару раз файл был занят и при попытке записи в него он просто становился нулевого размера (счетчики посещения часто слетали).
Я вам жуткую тайну скажу, ребята... даже великий Оракл хранит данные - в файлах! ) Все бд хранят данные в файлах. Мы вообще все практически храним в файлах Потому что для хранения используется файловая система ))
флоппик понятно)) Apple насчет txtSQL почитал в нете, пишут что файлы частенько обнуляются при большой нагрузке, как и писал antonn
флоппик Всё правильно, БД хранит всё в файлах, но вот часто используемые таблицы она хранит в оперативной памяти, а следовательно и на винт нагрузки никакой, на то они и БД чтоб оптимизировать нагрузку. Или я что то не понимаю?
Padaboo, а авторизации в нем не предусмотрено? А то любой может отвечать от имени админа или другого пользователя. А вообще прикольно! Я уже скачал и попробовал. В нем дыр нет? Можно на хост кидать?
Namer на то он и simple) там же админа по сути нет)можешь сделать массив с запрещенными именами проверять его in_array и присваивать Unknown) входящие переменные проверяются htmlspecialchars если переменные не заданы то exit и если ставить будешь то $var = substr($var, 0, $length); поменяй на $var = mb_substr($var, 0, $length,"utf-8"); чтобы кроказябр не было в core/class/chat.php
это миф ) да, можно заставить хранить определенные таблицы в памяти, можно заюзать ndbcluster, который хранит все таблицы в памяти, НО ЭТО ВСЕ НЕ ВАШИ СЛУЧАИ, по одной простой причине: в 99% случаев ресурс жесткого диска намного ДЕШЕВЛЕ ресурса ОЗУ, поэтому без особой нужды так никто не делает, естественно.