#php #javascript #yii2 #websocket
Возникли проблемы с веб-сокетом. Работает отлично, все супер, но если сокетом никто не пользуется больше 1 минуты, он выключается. Спустя минуту простоя я получаю "CloseEvent" c кодом "1000" на любой запрос. Когда подключен хотя бы один пользователь проблема решается пинг-понгом, но когда нет ни одного пользователя сокет висит без дела. Вроде уже указал все конфигурации связанные с timeout-ом, но не помогло. Сокет реализован с помощью библиотеки: https://github.com/pmill/php-chat Проверял на Open Server. Используется Apache в связке с Nginx.
Ответы
Ответ 1
Есть 2 способа решения этой проблемы: 1) Чтобы сервер пинговал каждые 30сек (любой интервал, меньше 1 минуты) 2) Реализовать функцию reconnect на клиенте, в случае обрыва соединения или reconnect по интервалу. Вот примерная реализация reconnect. Ты так же можешь использовать другие библиотеки, которые делают reconnect под капотом. const WebSocket = require('ws'); function WebSocketClient(){ this.number = 0; // Message number this.autoReconnectInterval = 5*1000; // ms } WebSocketClient.prototype.open = function(url){ this.url = url; this.instance = new WebSocket(this.url); this.instance.on('open',()=>{ this.onopen(); }); this.instance.on('message',(data,flags)=>{ this.number ++; this.onmessage(data,flags,this.number); }); this.instance.on('close',(e)=>{ switch (e.code){ case 1000: // CLOSE_NORMAL console.log("WebSocket: closed"); break; default: // Abnormal closure this.reconnect(e); break; } this.onclose(e); }); this.instance.on('error',(e)=>{ switch (e.code){ case 'ECONNREFUSED': this.reconnect(e); break; default: this.onerror(e); break; } }); } WebSocketClient.prototype.send = function(data,option){ try{ this.instance.send(data,option); }catch (e){ this.instance.emit('error',e); } } WebSocketClient.prototype.reconnect = function(e){ console.log(`WebSocketClient: retry in ${this.autoReconnectInterval}ms`,e); this.instance.removeAllListeners(); var that = this; setTimeout(function(){ console.log("WebSocketClient: reconnecting..."); that.open(that.url); },this.autoReconnectInterval); } WebSocketClient.prototype.onopen = function(e){ console.log("WebSocketClient: open",arguments); } WebSocketClient.prototype.onmessage = function(data,flags,number){ console.log("WebSocketClient: message",arguments); } WebSocketClient.prototype.onerror = function(e){ console.log("WebSocketClient: error",arguments); } WebSocketClient.prototype.onclose = function(e){ console.log("WebSocketClient: closed",arguments); } var wsc = new WebSocketClient(); wsc.open('wss://localhost:8080/'); wsc.onopen = function(e){ console.log("WebSocketClient connected:",e); this.send("Hello World !"); } wsc.onmessage = function(data,flags,number){ console.log(`WebSocketClient message #${number}: `,data); }Ответ 2
Кто бы мог подумать что проблема будет в конфигах MySQL. Спустя минуту бездействия база автоматически прерывает соединение с ней, а у меня при любом запросе происходила проверка прав пользователя. Для решения проблемы в mysql.ini нужно установить свойство wait_timeout в секундах сколько вам необходимо, у меня стояло по умолчанию 60. Так же прошу заметить что есть вариант "Б", если его таковым можно назвать. Для обхода проблемы можно воспользоваться "Supervisor", он в таких случаях решает следствие, а не причину. Он автоматически запускает или перезапускает сервер когда тот упал или недоступен. Для примера можно воспользоваться этим туториалом для установки и настройки Supervisor.
Комментариев нет:
Отправить комментарий