Я хочу запрограммировать HTTP WebChat, используя длинные HTTP-запросы (Comet), ajax и websockets (в зависимости от используемого браузера). База данных пользователя находится в mysql. Чат написан на PHP, за исключением, может быть, самого потока чата, который также может быть записан в javascript (node.js):
Я не хочу запускать php-процесс для каждого пользователя, так как нет хорошего способа отправить чат-сообщения между этими php-детьми. Поэтому я подумал о написании собственного сервера сокетов в PHP или node.js, который должен иметь возможность обрабатывать более 1000 подключений (пользователей чата). Как чисто веб-разработчик (php), я не очень хорошо разбираюсь в сокетах, поскольку я обычно позволяю веб-серверу заботиться о соединениях. Сообщения чата не будут сохранены на диске или в mysql, а в ОЗУ как массив или объект для лучшей скорости.
Насколько я знаю, нет способа одновременно обрабатывать несколько подключений в одном php-процессе (сервер сокетов), однако вы можете принимать большое количество соединений сокетов и обрабатывать их последовательно в цикле (чтение и запись, входящее сообщение → запись во все соединения сокетов). Проблема в том, что наиболее вероятно будет отставание от ~ 1000 пользователей, а операции с mysql могут замедлить работу всего, что повлияет на всех пользователей.
Мой вопрос: может ли node.js обрабатывать сервер сокетов с лучшей производительностью? node.js основан на событиях, но я не уверен, может ли он обрабатывать несколько событий одновременно (не нужно многопоточность?) или если есть очередь событий. С очередью событий это будет точно так же, как php: обрабатывать пользователя после пользователя.
Я мог бы также генерировать php-процесс в чате (гораздо меньше пользователей), но afaik есть однопоточные IRC-серверы, которые также способны обрабатывать тысячи пользователей. (написано на С++ или что-то еще), поэтому, возможно, это также возможно в php.
Я бы предпочел PHP над node.js, потому что тогда проект был бы php-only, а не смесью языков программирования. Однако, если Node может обрабатывать соединения одновременно, я бы выбрал его.