[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Однопоточность и События, Сокеты, Демонизирование
true
Уважаемые друзья!
Пишу (прошу не смеяться) крестики нолики на сокетах.
Идея проста: люди коннектяться, пишут сообщения, играют и т.п.

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

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

Например, сам демон - root-овый класс, в котором происходит весь экшн. Event - другой класс, который по сути представляет собой ассоциативный массив, для удобства реализован как объект.

При создании Event-a добавляем его в коллекцию событий root класса и добавляем в тот же бесконечный цикл где обрабатываются запросы сокетов. Но вот беда - на socket_select пхп подвисает и ждет пока чтонибудь произойдет хотя бы с одним из сокетов, и только потом проходит цикл до конца и выполняет евенты.


Можно ли как-то это обойти, и если можно, каков самый короткий путь?)

P.S. Начал копать в сторону многопоточности, но пока все сложно и непонятно..



Спустя 30 минут, 40 секунд (19.12.2010 - 22:27) kirik написал(а):
Если я правильно понял задачу:
Каждый из клиентов должен посылать Ajax запрос к серверу, и ожидать ответа (таймаут у запроса вроде бы 30 секунд). Как только на сервере произошли какие-то изменения сервер посылает ответ клиентам. Клиент в свою очередь применяет изменения и опять посылает Ajax запрос в ожидании ответа.
После нажатия кнопки (при установке крестика/нолика) мы делаем еще один запрос ajax'ом, на изменение поля игры. Сервер вносит изменения, на которые реагирует паралельный ajax запрос (который висит в ожидании ответа). И так до бесконечности smile.gif
Ну и тут нужно остлеживать когда происходит таймаут запроса, чтобы послать еще один (например если аппонент думал больше 30 секунд).

Надеюсь понятно объяснил. Можете посмотреть в сторону realplexor от Котерова. Единственное он написан на perl и сложнее в функционале/реализации. Но идея остается всё той же.

Спустя 43 минуты, 54 секунды (19.12.2010 - 23:11) true написал(а):
Совсем не так)) вероятно я не правильно объяснил. Реализовать кучу запросов на ajax для меня не проблема, но это далеко не лучшее решение на мой взгляд, ибо рано или поздно апач просто рухнет изза кучи чатов, которые в аяксе лезут на сервер, и прочих запросов. Меня интересует реализация когда сервер сам обращается к клиенту и наоборот. Никаких холостых запросов. Более того, в игре необходимо реал-тайм участие. А с ajax-oм будут задержки. хоть в 30 секунд - но уже неприятно.

Покурил доки, поразмышлял. Теперь, думаю, могу задать более четкий вопрос.
Решение 1.
Есть демон (root), который слушает свой порт и чтото делает. так как среди задач, которые он должен выполнить нет таких, которые могли бы занять много времени, то он будет у нас самым главным и выполнять абсолютно все операции.

Есть демон 2. (Event manager). Имеет наивысший приоритет для Root-демона. как только случается какое-либо внутренее событие - отправляет сокетный запрос к Root-демону на выполнение заданного евента.

Есть демон 3. (Client manager). Имеет низший приоритет для Root-демона. как только какой-либо из сокетов передает какие либо данные на сервер, коннектится/ дисконнектится и т.п. он отправляет информацию Root-демону а тот уже решает что ему со всем этим делать.

По сути, получается многопроцессовая система. Но. очень много гемора я вам скажу biggrin.gif:D

Есть второй вариант. форканье.
Есть 1 демон. Форкаем пару раз и работаем с процессами-детьми (один работает с сокетами юзеров, другой работает с евентами). Хотя после курения мануала стало немного жутковато. Но ко всему привыкаешь рано или поздно)

Какой путь более элегантный в данном случае?

Спустя 4 часа, 22 минуты, 4 секунды (20.12.2010 - 03:33) kirik написал(а):
Цитата (true @ 19.12.2010 - 15:11)
апач просто рухнет изза кучи чатов

А какое участие тут принимает апач, если у вас на сокетах реализация?
Да и нагрузка будет небольшая, потому что клиенты просто подключены в ожидании ответа сервера. Тоесть никакие даннные не передаются. Клиенты "висят".

Цитата (true @ 19.12.2010 - 15:11)
Меня интересует реализация когда сервер сам обращается к клиенту и наоборот.

Сервер к клиенту обратится никак не может ибо на то это сервер и клиент.

Цитата (true @ 19.12.2010 - 15:11)
А с ajax-oм будут задержки. хоть в 30 секунд - но уже неприятно.

Вы не поняли. Задержек не будет вообще. А 30 секунд - это таймаут аякса.

Цитата (true @ 19.12.2010 - 15:11)
Какой путь более элегантный в данном случае?

Демон должен быть один, сложные и долгие операции должны запускать отдельный процесс и уводить его в фон.

Спустя 5 часов, 17 минут, 35 секунд (20.12.2010 - 08:51) true написал(а):
молодой человек, аякса на сокетах не бывает. Коль есть аякс (XmlHttpRequest, он же javascript, который выполняет запросы к страницам веб-сервера)
тут никакой речи не может быть об аяксе, тема о сокетах.

P.S. Выше я указал что для моего демона нет трудоемких задач. Много маленьких.

демон не может быть один в силу однопоточности php.

всем спасибо, проблема решена.

P.P.S. Странно, вроде сайт называется "php forum", а никто ничего интересно посоветовать не может, кроме как аякс который работает по вообще другому протоколу.

Спустя 3 минуты, 50 секунд (20.12.2010 - 08:55) Семён написал(а):
Советую посмотреть что такое Comet-сервер

Спустя 9 минут, 42 секунды (20.12.2010 - 09:04) true написал(а):
2 Семен: Спасибо, довольно интересно. буду изучать:)

Спустя 10 минут, 8 секунд (20.12.2010 - 09:14) Семён написал(а):
Цитата (true @ 20.12.2010 - 10:04)
2 Семен: Спасибо, довольно интересно. буду изучать:)

нз rolleyes.gif

Спустя 26 минут, 38 секунд (20.12.2010 - 09:41) kirik написал(а):
Цитата (true @ 20.12.2010 - 00:51)
Коль есть аякс (XmlHttpRequest, он же javascript, который выполняет запросы к страницам веб-сервера)

Да что вы к этому вебсерверу пристали. Аякс, он же XmlHttpRequest выполняет запросы по http протоколу. А что висит на конце этого протокола - это может быть что угодно тот же
Цитата (kirik @ 19.12.2010 - 14:27)
realplexor от Котерова
ака "комет-сервер".
Быстрый ответ:

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