Slavenin999
@Slavenin999
программист php/erlang/elixir/js

Подвисает socket-server?

Доброго времени суток, Хабр!



Есть сокет-сервер. Работает хорошо, но как-то не очень стабильно. Проблема в следующем, если скрипт работает более суток, то он перестает нормально писать информацию в сокеты. Сервер служит транспортом для личных сообщений и выполняет еще несколько служебных функций. После запуска работает хорошо и быстро, инфа рассылается по всем открытым сокетам нужных пользователей. Но после того, как пройдет некоторый интервал (около суток) что-то ломается. При этом сервер принимает входящие подключения, регистрирует и отключает пользователей пишет в базу, в общем делает все, кроме отправки сообщения. При этом логе пишет, что информацию такую-то в такой-то сокет отправил. Но клиент её не получает. В логе php ошибок нет. Сервер написан на php клиентская часть работает с использование web сокетов. Пока решением проблемы вижу перезапуск сервера через какой-то интервал. Но это, на мой взгляд, как-то не очень правильно.



PS О том, что писать такие вещи нужно на чём-то другом, я знаю, но пока нет времени учить еще один язык.



Если кто-то сталкивался с такой проблемой, поделитесь пожалуйста.
  • Вопрос задан
  • 3221 просмотр
Пригласить эксперта
Ответы на вопрос 4
EugeneOZ
@EugeneOZ
PHP всё равно имеет утечки памяти, так что перезапускать придётся. Раньше/позже — не так критично, имхо. Думаю, в код можно добавить такие кусочки, которые сделают перезапуск безопасной и штатной операцией.
Однако, это не решение проблемы в Вашем случае. Нужно найти способ определить в скрипте, что сообщение не отправлено в сокет (проверить?), чтобы он сам себя перезапустил.
Ответ написан
AterCattus
@AterCattus
Люблю быстрый backend
Если есть возможность, сравните по strace работу сервиса сразу после запуска и «спустя сутки», когда все сломалось, на неких эталонных запросах.
Ответ написан
Комментировать
Altimar
@Altimar
Та же беда была только на Питоне при рассылке push уведомлений. Использовал send_all, но выяснилось, что при переполнении сетевого буфера поток отправки намертво вис (раньше интернет у сервера периодически пропадал и уведомлений успевало отправиться много). Переделал на send и в select жду готовности на запись. Если таймаут выходит — перезагрузка. Может тут проблема в том же?
Ответ написан
Комментировать
vsespb
@vsespb
php.net/manual/ru/function.socket-write.php

socket_write() не обязательно записывает все байты из указанного буфера

Это обрабатываете?

www.php.net/manual/ru/function.socket-last-error.php
Может ли это возвращать что-то типа EINTR/EAGAIN? Вообще ошибки обрабатываете?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы