правильно ли я реализовал long polling? может что-то нужно сделать по другому? Код (Text): if(isset($_POST['last_id']) && $_POST['last_id'] != ""){ $link = mysql_connect("localhost","xxx","yyy"); mysql_select_db("zzz"); mysql_set_charset('utf8'); function get_reply(){ $query = 'SELECT `id`,`pid`,`text`,`name`,`lvl`,`date` FROM `comments` WHERE `id` > '.$_POST['last_id'].' ORDER BY `id` DESC LIMIT 30'; $result = mysql_query($query); if(mysql_num_rows($result) > 0){ $data = array(); while($row = mysql_fetch_assoc($result)){ $data[$row['id']] = $row; } echo json_encode($data); }else{ usleep(1000); get_reply(); } } get_reply(); mysql_close($link); } Добавлено спустя 8 минут 44 секунды: в случае превышения таймлимита (либо другой ошибки) клиент отправляет аякс запрос заново
Сразу честно скажу, что я никогда не использовал эту технологию и совсем её не знаю. Но есть некоторое представление о том, зачем оно надо и как должно работать. Возможно, моё представление неверно. Во-первых, как я понимаю, это придумали для того, чтобы разгрузить сервер от лишних запросов, на которые пока нечего ответить. Во-вторых, чтобы пользователь получал новые данные не раз в заданный интервал времени, а мгновенно, как только они появились. Тот код, который показан выше - это ежесекундное дёргание б.д. и проверка, есть ли там что-то новое. По сути, это всё теже ежесекундные запросы и пользователь получит ответ не сразу, как он появился, а спустя какой-то интервал времени. Кроме того, если на сайте будет сидеть сотня пользователей, то это будет сотня потенциально ненужных запросов в секунду к базе. Я думаю, что серверная часть - это должно быть нечто "событийное". И написанное, скорее всего, не на PHP. Это вроде как onchange в JS Программа должна либо держать одновременно множество соединений и при наличии нового запроса на добавление данных - определять, кому их нужно показать и отправлять, либо это может быть несколько процессов, которые могут "общаться", но не через файл или базу, а "дёргать друг друга" напрямую. Но как это реализовать технически - на данный момент не знаю. Изучаю Си в свободное время, но пока как-то медленно...
Да, долно быть событийное. Но, событие всё равно что то да инициализирует. Что бы не делать кучу запросов в БД можно воспользоватся shared memory. Вот тут есть пример http://habrahabr.ru/post/128535/
ой, ну ребят. если у вас так усё запущено, может сразу на яве или на сях писать сервер? Будет прям как пулемёт.
То есть делать каждую секунду запрос в бд от каждого юзера + я уверен что ещё само открытие страницы делает дапросы, это по вашему оптимально?) Ну давайте писать сайты для 100 юзеров максимум ps сервера на с++ и пишу всегда php на то и пхп что бы сайты писать)
это уже второй топик, в котором автор планирует и проектирует, всё еще отказываясь назвать примерную нагрузку. 1 запрос в секунду, даже если всю страницу перерисовывать заново, даже со всеми запросами - это херня =) если юзеров не много. я б не чесал репу и не тыкал бы пальцем в небо. надо прикинуть количество. от этого плясать. а так - гадание на кофейной гуще.
да не стоит плясать от количества, если делать, то делать хорошо Добавлено спустя 1 минуту 31 секунду: а вот решение которое я использую http://pastebin.com/af8hF88J
Это вот самая большая глупость, которую может сказать взрослый человек. варианты: http://yandex.ru/yandsearch?clid=14585&text=%D0%BB%D1%8E%D0 ... %BD&lr=213
если будут проблемы с этим, хотя маловероятно, есть вариант оправлять запросы в демона, а не на веб сервер, но не факт что демон на пхп "понравится" хостеру
Понимаете, мало найти идею, нужно ее еще осмыслить. Вы хотите шаред память, что бы жить под нагрузками, но у вас fork модель (а какая еще на хостинге) и нелоченная память, которая под одновременной записью начнет давать мусор. Это маловероятно, да... если нет нагрузок. Но в общем можно было и базу спрашивать постоянно =) Что бы я предложил? Не поверите... файл Файл можно читать в цикле (tail -f знаете?). Запись в файл в большинстве юникс-ос атомарна в пределах страницы памяти, т.е. около 4к, т.е. даже лочить ничего не нужно, если сообщения мелкие. Ну и не требуется поддержки работы с shmop, которую могут на хостинге и отключить.
я с вами согласен, но моих нагрузок достаточно для того чтобы быть уверенным в том что вероятность возникновения двух событий одновременно настолько мала что учитывать ее не стоит
проблема одновременной записи решилась загуглив по перво ссылке Код (Text): if($sem_id = sem_get(ftok(__FILE__, 'e'))){ if (sem_acquire($sem_id)){ ... }else return; } а так как мой хостер обеспечивает поддержку семафоров первый же комент на офе дал результат Код (Text): if ( !function_exists('sem_get') ) { function sem_get($key) { return fopen(__FILE__.'.sem.'.$key, 'w+'); } function sem_acquire($sem_id) { return flock($sem_id, LOCK_EX); } function sem_release($sem_id) { return flock($sem_id, LOCK_UN); } }