Имею у себя библиотеку 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 и всякие другие проверки. Но вероятнее всего проблема именно в запросе или базе