botbot
Новичок
Ошибка socket_recv()
Есть сервер, который выполняет роль чата. Запущен не через апач, а как отдельный процесс в ОС, написанный на php. Основной цикл приёма сообщений/событий от клиентов:
Все не относящиеся к делу строчки убрал. Так вот, временами (не всегда, но время от времени), вся это конструкция падает со словами
Пробовал обрамллять socket_recv() try/catch конструкцией, но генерируется не исключение, а именно ошибка, которая попадает в мой error_handler.
Вопрос: как можно понять, что сокет нельзя читать? Как сделать, чтобы чат не падал?
Есть сервер, который выполняет роль чата. Запущен не через апач, а как отдельный процесс в ОС, написанный на php. Основной цикл приёма сообщений/событий от клиентов:
PHP:
while(true) {
$changed_sockets = $this->sockets; // все подключённые клиенты + сокет на ожидание новых подключений
$write = array(); // это чтобы не ругался интерпретатор
$except = array(); // это тоже.
$num_changed_sockets = socket_select($changed_sockets, $write, $except, NULL);
// анализ изменений в сокетах
foreach($changed_sockets as $socket) {
if ($socket == $this->master) {
// новое подключение
if (($client = socket_accept($this->master)) < 0) {
continue;
} else {
array_push($this->sockets, $client);
}
} else {
// кто-то из существующих юзеров
$bytes = socket_recv($socket, $buffer, 2048, 0); // <- ВОТ ТУТ ошибка
if ($bytes == 0) {
// закрылась конекция
$index = array_search($socket, $this->sockets);
unset($this->sockets[$index]);
socket_close($socket);
}else{
// приём сообщения
}
}
}
}
Кому лень разбирать весь код: сначала вызывается socket_select, она оставляет в $read сокеты, которым есть что сказать. Потом вызывается socket_recv для этих сокетов, и иногда она падает и рушит весь скрипт.2: socket_recv(): unable to read from socket [110]: Connection timed out
Пробовал обрамллять socket_recv() try/catch конструкцией, но генерируется не исключение, а именно ошибка, которая попадает в мой error_handler.
Вопрос: как можно понять, что сокет нельзя читать? Как сделать, чтобы чат не падал?