[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP-chat, минимизировать задержку
shenon
Имеется два пользователя. Оба открыли страницу на сервере. Первый посылает сообщение в чат. Как только оно доходит до сервера, сервер сразу посылает его второму пользователю. Нужно чтобы это работало оптимально быстро, без перезагрузок страниц, без периодических засыпаний. Я не понимаю, какие есть механизмы в PHP, которые позволят первому пользователю разбудить спящий процесс по которому произойдёт передача сообщения от сервера ко второму пользователю. Например, можно было бы сделать на основе блокировки файла.
допустим первый пользователь блокирует файл. Затем второй пользователь открывает страницу, в которой пытается получить доступ к файлу и выходит в ожидание.

Первый
$fp=fopen("lock.dat","a+");
flock ($fp,LOCK_EX);
//здесь первый пользователь заполняет текст
//и отправляет его на сервер
//как только он отправил данные на сайт
//он разблокирует файл блокировки
flock ($fp,LOCK_UN);
fclose($fp);


Второй
$fp=fopen("lock.dat","a+");
flock ($fp,LOCK_EX);
//сюда второй пользователь попадает как только
//первый пользователь разблокировал файл
//здесь он считывает данные которые оставил на сервере первый пользователь
flock ($fp,LOCK_UN);
fclose($fp);


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




Спустя 31 минута, 13 секунд (7.07.2010 - 18:27) Basili4 написал(а):
ваш алгоритм тянет минимум на звание Бреда имено с большой буквы на кой что то там блокировать.


есть база в ней есть таблица с сообщениями пользователь 1 пишет сообщение он попадает в базу. у пользователя 2 работает скрипт js который по таймеру вызывает скрипт php который знает сколько есть записей в базе если их количество увеличилось значит он выбирает разницу в записях и возращает их скрипту js который их в свою очередь выводид куда ему надо. также работает все и в обратном направлении

Спустя 1 час, 27 минут, 40 секунд (7.07.2010 - 19:55) shenon написал(а):
Я как раз и спрашиваю как сделать так, чтобы не по таймеру считывать, а мгновенно, то есть настолько быстро, насколько это позволяет система. Если ведь установить таймер например на 10 миллисекунд, то сто раз в секунду скачивать страницу чтобы проверить не пришло ли сообщение это и есть Бред, который вы предложили коллега. Хочется построить так систему, чтобы не было такой регулярной перезагрузки страницы. В MSVC есть WaitForSinngleObject , в PHP насколько я знаю такого нет.

Спустя 22 часа, 43 минуты, 22 секунды (8.07.2010 - 18:38) Guest написал(а):
Я не спрашивал как написать скрипт для второго пользователя. Здесь проблем нет, мне всё понятно.
Запустите такой скрипт и убедитесь, что отправка по инициативе сервера возможна. Поэтому проблемы с регулярной перезагрузкой страницы со стороны получателя нет.

<HTML>
<
meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<
BODY>
<?php
ob_start();
ob_implicit_flush(true);
set_time_limit(0);
for ($i=0; $i<100; $i++)
{ print "$i ";
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
?>
</BODY>
</
HTML>




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

Спустя 24 минуты, 7 секунд (8.07.2010 - 19:02) sergeiss написал(а):
Используй AJAX и будет тебе счастье...

Спустя 16 часов, 31 минута, 32 секунды (9.07.2010 - 11:34) Nikitian написал(а):
Если надо не по таймеру, а мгновенно, то надо держать постоянно открытое соединение. Ключевое слово: COMET.
Пример и инструменты для реализации здесь
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.