@DEnisLEB

Конфликт MySql и WebSocket, как решить?

Имею у себя библиотеку redbeanphp и rather websocket. Сейчас нахожусь на пункте генерации номера соединения по базе данных, и это относительно работает. Почему относительно? При бездействие на сайте более минуты (сообщения продолжают отправляться) {Вы спросите, фигли ты тогда тут пишешь...} А вот, при перезагрузке страницы после этого самого простоя(именно перезагрузке, если не перезагружать, соединение останется рабочим) выкидывает подобную ошибку, и даже после нескольких перезагрузок соединение не востановится, до перезагрузки сервера:

Warning: Error while sending QUERY packet. PID=13512 in D:\com\tlogi\websocket\rb.php on line 747
An error has occurred: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away


Методом проб и ошибок отрубил кеширование запросов в библиотеке redbeanphp ибо при изменение значения в базе, скрипт не проводил проверку подключения повторно. Теперь он проводит, но вот такая ерундень, склоняюсь к проблемам с базой. Возможно увеличение времени timeout изменит ситуацию, но я так понимаю. При бездействие допустим более часа ошибка с невозможностью переподключиться останется. Любителям просить код посвящается Chat.php

<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

require "D:/com/tlogi/websocket/config.php";


class Chat implements MessageComponentInterface {
protected $clients;


public function __construct() {
  $this->clients = new \SplObjectStorage;
}
public function onOpen(ConnectionInterface $conn) {
  // Store the new connection to send messages to later

//Получаем куки юзера


$conn->cookie = $conn->WebSocket->request->getCookies('Cookie');

if ((isset($conn->cookie['id']))&& (isset($conn->cookie['hash']))&&(empty($conn->resourceId))){
  if ((!empty($conn->cookie['id'])) && (!empty($conn->cookie['hash']))){
$conn->dbarrred = \R::findOne( 'user', ' id = ? ', array($conn->cookie['id']));
 if($conn->cookie['hash'] == $conn->dbarrred['hash'] ){
         if($conn->dbarrred['type'] != 0){
           if($conn->dbarrred['type'] == 6){
          header('Location: http://'.$_SERVER['SERVER_NAME'].'/ban');
           }else{
$conn->resourceId = $conn->cookie['id'];
$this->clients->attach($conn);
echo "New ! ({$conn->resourceId})\n";}
        }else{
          // ваш аккаун не активирован проверь почту/*
$conn->resourceId = $conn->cookie['id'];
$this->clients->attach($conn);
echo "New ! ({$conn->resourceId})\n"; }
       }else{
//Разрыв соединения
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected, error 1\n"; }
      }else{
//Разрыв соединения
$this->clients->detach($conn);
echo "Connection {$conn->resourceId} has disconnected, error 2\n";
      }
  }else{
  //Разрыв соединения
  $this->clients->detach($conn);
  echo "Connection {$conn->resourceId} has disconnected, error 3\n";
  }
}

public function onMessage(ConnectionInterface $from, $msg) {
  $numRecv = count($this->clients) - 1;
  echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
, $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');

foreach ($this->clients as $client) {

// if ($from !== $client) {

  $client->send($msg);

// }
}
}

public function onClose(ConnectionInterface $conn) {
  // The connection is closed, remove it, as we can no longer send it messages
//var_dump($conn->dbarrred);
  $this->clients->detach($conn);
  echo "Connection {$conn->resourceId} has disconnected\n";


}
public function onError(ConnectionInterface $conn, \Exception $e) {
  echo "An error has occurred: {$e->getMessage()}\n";
  $conn->close();
}
}

Кратко: в функции onOpen получаем куки, проверяем их по базе в виде пары id:hash и всякие другие проверки. Но вероятнее всего проблема именно в запросе или базе
  • Вопрос задан
  • 712 просмотров
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
по таймауту подключения к базе отваливается.
Надо или таймаут делать околобесконечным или подключаться каждый раз при обращении в базу.
Или держать пул коннектов к базе которые сами собой обновляются/закрываются/открываются. (не помню чтоб в пыхе такое было, nodejs так умеет)

Или пинать базу раз в N времени чтобы коннект не обравался.
https://github.com/GeniusesOfSymfony/WebSocketBund...
Ответ написан
Ваш ответ на вопрос

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

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