храповой цикл событий блокируется

Я создаю соединение с веб-сокетом, используя храповик php. Я подключил клиента, а затем выполнил запрос (выполнение запроса займет около 20 секунд), в то же время я пытаюсь подключить другого клиента и вижу, что соединение с веб-сокетом находится в состоянии ожидания (все еще пытается переключить протокол) . Позже, когда пришел ответ на первоначальный запрос, я вижу, что сервер печатает «установлено новое соединение» (сохранил это утверждение в моей функции onOpen).

Если react php работает по тому же принципу, что и NodeJs, то даже если обработка занимает много времени, разве не должно устанавливаться соединение?

Почему соединение с веб-сокетом блокируется из-за более поздней части выполнения?


person Aks    schedule 08.08.2016    source источник


Ответы (1)


Ну, это не совсем точно. Ratchet PHP и NodeJS не похожи друг на друга. Они не работают точно так же.

Что делает Ratchet PHP, так это использует неблокирующие потоки ввода/вывода. Это все, начиная от TCP/IP-подключений к вашему WS-серверу и заканчивая любыми другими подключениями ввода-вывода, поддерживаемыми фреймворком.

Однако вы убедились, что выполняете запрос, который, как я предполагаю, был запросом к базе данных? Если вы установили соединение с этой базой данных самостоятельно, а не через средство неблокирующего потока ввода-вывода Ratchet, то запрос к базе данных выполняется через блокирующий сокет TCP/UNIX. Это означает, что PHP должен сидеть и ждать, пока ваша СУБД ответит на запрос, прежде чем он сможет продолжить выполнение какого-либо кода. Таким образом, в то же время ваш сервер WebSocket не может отвечать на какие-либо другие запросы, принимать любые другие соединения или даже запускать другую строку кода, пока эта система базы данных не ответит, потому что сокет TCP находится в состоянии WAIT. Он просто сидит и ждет, когда данные поступят по трубе.

person Sherif    schedule 23.08.2016
comment
Так как же использовать средство неблокирующего потока ввода-вывода вместо самостоятельного подключения к базе данных? - person TheStoryCoder; 23.04.2017