возможно ли реализовать такое средствами php

makvik

Новичок
возможно ли реализовать такое средствами php

Есть система, одной из частей которой является чат.

Можно ли средствами php реализовать следующее:

Пользователь (1) отправляет пользователю (2) сообщение. Сообщение приходит на сервер и тут же отправляется клиенту (2), как тот его уже будет обрабатывать пока не важно.

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

Есть ли материалы в сети на эту тему? не понимаю что гуглить, чтобы найти их ))
 

AmdY

Пью пиво
Команда форума
дозагрузку на РНР никто не делает.
 

sunswordrie

Новичок
AJAX с проверкой на наличие сообщений вам в помощь. Раз в 5 секунд или 10 опрашивать базу.
 

AmdY

Пью пиво
Команда форума
sunswordrie
вот человек потому предусмотрительно в первом посте и сказал, что так не хочет
Wicked
вроде как есть возможность, даже на форуме кто-то ссылку давал, но я не смотрел :(
 

dimagolov

Новичок
Сomet это называется...
но для чатов, не супер-нагруженных, это не нужно.
 

makvik

Новичок
Автор оригинала: sunswordrie
AJAX с проверкой на наличие сообщений вам в помощь. Раз в 5 секунд или 10 опрашивать базу.
Поясню почему это не вариант:

Сообщения могут идти раз в полминуты. В таком случае на сервер будет идти лишние запросы. При обновлении раз в 5 секунд мы будем иметь 5 запросов, которые будут только "грузить" сервак.

Но переписка может быть активной. В таком случае в одну секунду может быть 1-2 сообщения. В этом случае при обновлении раз в 5 секунд будет некоторая "заторможенность", чего мне крайне не хочется.

Потому оптимальным решением является то, что я описал выше.

---

А вообще, теоретически если... Человек логинится на сайте. Создаётся некий идентификатор подключения (*). Второй пользователь отсылает на сервер запрос, в котором содержиться ник первого пользователя. Путём нехитрых махинаций с каким-нибудь хранилищем данных мы по нику "достаём" идентификатор (*) и по нему отправляем "ответ" первому пользователю.

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

-~{}~ 18.05.08 00:09:

dimagolov
ну вот, пока писал - ты ответил. Спасибо, теперь знаю что искать.
 

dimagolov

Новичок
makvik, про взаимодействие клиентов без сервера это таки бред.

а вот про нагрузку на сервер это ты зря, так как чат можно ложить в memory table БД которая на диск писаться не будет и ресурсов на запрос к котрой тоже будет уходить минимум. а вообще частоту обновления можно динамически менять, в зависимости от нагрузки - чем больше пользователей, тем медленней они будут обновляться. даже можно смотреть среднюю скоросто появления сообщений и это тоже учитывать в корректировке интервала обновления. Если отдавать не весь чат каждому клиенту, а только обновления после его последнего запроса, то размер отклика всегда будет небольшим.
 

makvik

Новичок
Автор оригинала: dimagolov
Если отдавать не весь чат каждому клиенту, а только обновления после его последнего запроса, то размер отклика всегда будет небольшим.
ну это само собой разумеется %). Хотел бы я посмотреть на человека, который бы каждый раз подгружал 10-20 килобайтный лог чата )))

Спасибо за пост, как-то о некоторых вещах мне даже мысли в голову не пришло. Буду думать ).
 

dimagolov

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

AmdY

Пью пиво
Команда форума
:), у меня есть даже пример как сделать обработчик сесий на бд.
 

Santiago

Новичок
makvik
Если сохранность данных не особо важна, то поднимайте memcached и храните в нем и сессии, и чат.
 

AmdY

Пью пиво
Команда форума
сохранность можно обеспечить постоянным сливом из memcached в базу.
но проблемма не в этом, такие вещи пишутся на сокетах, чтобы не поднимать на каждый запрос апач.
 

Wicked

Новичок
Santiago
чтобы не поднимать на каждый запрос новый процесс пхп: те же же nginx+fastcgi использовать для таких задач тоже слишком накладно.
 

Santiago

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

Alexandre

PHPПенсионер
Значит, как я понимаю, придётся писать на C / C ++ ?
не принципиально на чем писать,
первоночально главное разобраться как ты это собираешься сделать.

ты напрямую не сможешь передать Сообщение Пользователю 2 от сервера.
Пользователь 2 должен постоянно сканировать сервер на наличие ему сообщений.
обычно это делается с исп. аякса. или иного авторефреша (например IFRAME)
а вот что запрашивать на сервере - это уже второй вопрос, либо пхп скрипт, либо реализовать это отдельным демоном
 
Сверху