Имею у себя библиотеку redbeanphp и rather websocket. Сейчас нахожусь на пункте генерации номера соединения по базе данных, и это относительно работает. Почему относительно? При бездействие на сайте более минуты (сообщения продолжают отправляться) {Вы спросите, фигли ты тогда тут пишешь...} А вот, при перезагрузке страницы после этого самого простоя(именно перезагрузке, если не перезагружать, соединение останется рабочим) выкидывает подобную ошибку, и даже после нескольких перезагрузок соединение не востановится, до перезагрузки сервера: Код (Text): 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: <?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 и всякие другие проверки. Но вероятнее всего проблема именно в запросе или базе Вопрос задан только что
дурацкое предположение: настрой keep-alive ну или переоткрывай каждый раз соединение с mysql , это общие предположения, конкретно с мускулом и пхпхой знаком плохо. в 747 строке что?
вывод ошибки подключения к базе, (код ошибки базы выше), дак даже если запрос никуда не идёт крашит( даже если переменная нигде не используется)
именно по нему я и написал, сервер мускула закрыл соединение, а клиент(библиотека) пытается по нему ломиться. в 747 строке файла D:\com\tlogi\websocket\rb.php что?
Боже какой ужасный год надо городить на PHP для работы с WS. Почему бы не добавить в свое приложение где нужны веб-сокеты прослойку node.js, который будет обрабатывать это все нормально. А серверу PHP сделать API для веб сокетов, что бы записывать в БД и совершать прочие операций?