Libevent + websockets + SHM IPC решит все проблемы и нагрузка в 1000 запросов в секунду будет обрабатываться в лет.
Пишется единственный демон на
phpДемон будет выступать в роли фронтенда который будет принимать подключения по websockets, так же он будет открывать разделяемый участок памяти который будет проверять на входящие сообщения и если сообщение есть будет его отсылать определенному юзеру, либо броадкастом всем юзерам. Но тут есть один небольшой геморой, SHM IPC не поддерживает полинг, а значит, придется гонять цикл проверки на новые мессаги, что не есть гуд, но я придумал костыль с SIGIO это не быстрее чем гонять цикл, зато уменьшит задержки (до определенных моментов), pcntl функции передачи сигналов конечно быстрая штука, но если такие сигналы будут идти по 10к в секунду, тут будет узкое место, но в таком случае PHP вообще не уместен.
А теперь о том, как юзера будут отправлять мессаджи, логику работы приложения я не знаю, возможно это будет отдельный
скрипт который будет проверять правильность введенных данных и при успехе записывать мессадж в разделяемый участок памяти, но я бы не рекомендовал этот метод, лучше перевести всю логику на обвязку libevent + websockets без участия разделяемой памяти. Если демон будет выполнять простые операции в виде отправки данных всем юзерам (как в чатах), то отдельный "тяжелый" процесс нам не понадобится, который может отрабатывать столько, сколько хочет, а потом возвращать результат обратно.
Например: пользователь отправил запрос на обработку каких либо данных, при этом на их обработку понадобится потратить 100 секунд, в этом случае демон зависнет в обработке этих данных и перестанет принимать данные от других пользователей, так дело не пойдет и такие тяжелые процессы лучше разделить на выполнение в другом процессе, вот тут может придти на помощь разделяемая память. Я по этому поводу гемороился в свое время, но в конечном итоге меня не устроила скорость обработки огромных массивов данных, при скорости ОЗУ в 20 гб/с скорость падала до 6 гб/с для соединения типа точка-точка.
http://phpforum.ru/index.php?showtopic=59928http://phpforum.ru/index.php?showtopic=59689Вот тут и возникло то узкое место с сигналами в pcntl.
Если массивы данных будут не такие большие, то вариант очень не плохой, но инфы в интернете об этом нет и не будет, извращенцев и адептов PHP-BDSM практически нет
Так же есть еще одна проблема, это переполнение разделяемого участка памяти, если демон не будет успевать обрабатывать данные, а запись в разделяемый сегмент будет вестись в конечном итоге сегмент отвалится, за этим нужно следить и предотвращать сообщая пользователю, что: извени мол сервис сейчас не может обработать запрос.
Рекомендую глянуть
http://phpdaemon.net/ готовое решение, есть даже примеры работы с вебсокетами
http://habrahabr.ru/post/79377/Помню давно еще чатик не выдержал хабраэффекта
Потому что Хабровчане народ лютый, начал DDoSить сокеты и чат успешно падал, автор не реализовал проверку на флуд сокета, а делается он достаточно просто с замером DPS (Data per second) + dpIPs (data per ip second)