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