За последние 24 часа нас посетили 20523 программиста и 1007 роботов. Сейчас ищут 419 программистов ...

Конфликт MySql и WebSocket

Тема в разделе "PHP для профи", создана пользователем Денис404, 4 сен 2018.

  1. Денис404

    Денис404 Новичок

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

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

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

    PHP:
    1. <?php
    2. namespace MyApp;
    3. use Ratchet\MessageComponentInterface;
    4. use Ratchet\ConnectionInterface;
    5.  
    6. require "D:/com/tlogi/websocket/config.php";
    7.  
    8.  
    9. class Chat implements MessageComponentInterface {
    10. protected $clients;
    11.  
    12.  
    13. public function __construct() {
    14.   $this->clients = new \SplObjectStorage;
    15. }
    16. public function onOpen(ConnectionInterface $conn) {
    17.   // Store the new connection to send messages to later
    18.  
    19. //Получаем куки юзера
    20.  
    21.  
    22. $conn->cookie = $conn->WebSocket->request->getCookies('Cookie');
    23.  
    24. if ((isset($conn->cookie['id']))&& (isset($conn->cookie['hash']))&&(empty($conn->resourceId))){
    25.   if ((!empty($conn->cookie['id'])) && (!empty($conn->cookie['hash']))){
    26. $conn->dbarrred = \R::findOne( 'user', ' id = ? ', array($conn->cookie['id']));
    27. if($conn->cookie['hash'] == $conn->dbarrred['hash'] ){
    28.          if($conn->dbarrred['type'] != 0){
    29.            if($conn->dbarrred['type'] == 6){
    30.           header('Location: http://'.$_SERVER['SERVER_NAME'].'/ban');
    31.            }else{
    32. $conn->resourceId = $conn->cookie['id'];
    33. $this->clients->attach($conn);
    34. echo "New ! ({$conn->resourceId})\n";}
    35.         }else{
    36.           // ваш аккаун не активирован проверь почту/*
    37. $conn->resourceId = $conn->cookie['id'];
    38. $this->clients->attach($conn);
    39. echo "New ! ({$conn->resourceId})\n"; }
    40.        }else{
    41. //Разрыв соединения
    42. $this->clients->detach($conn);
    43. echo "Connection {$conn->resourceId} has disconnected, error 1\n"; }
    44.       }else{
    45. //Разрыв соединения
    46. $this->clients->detach($conn);
    47. echo "Connection {$conn->resourceId} has disconnected, error 2\n";
    48.       }
    49.   }else{
    50.   //Разрыв соединения
    51.   $this->clients->detach($conn);
    52.   echo "Connection {$conn->resourceId} has disconnected, error 3\n";
    53.   }
    54. }
    55.  
    56. public function onMessage(ConnectionInterface $from, $msg) {
    57.   $numRecv = count($this->clients) - 1;
    58.   echo sprintf('Connection %d sending message "%s" to %d other connection%s' . "\n"
    59. , $from->resourceId, $msg, $numRecv, $numRecv == 1 ? '' : 's');
    60.  
    61. foreach ($this->clients as $client) {
    62.  
    63. // if ($from !== $client) {
    64.  
    65.   $client->send($msg);
    66.  
    67. // }
    68. }
    69. }
    70.  
    71. public function onClose(ConnectionInterface $conn) {
    72.   // The connection is closed, remove it, as we can no longer send it messages
    73. //var_dump($conn->dbarrred);
    74.   $this->clients->detach($conn);
    75.   echo "Connection {$conn->resourceId} has disconnected\n";
    76.  
    77.  
    78. }
    79. public function onError(ConnectionInterface $conn, \Exception $e) {
    80.   echo "An error has occurred: {$e->getMessage()}\n";
    81.   $conn->close();
    82. }
    83. }
    Кратко: в функции onOpen получаем куки, проверяем их по базе в виде пары id:hash и всякие другие проверки. Но вероятнее всего проблема именно в запросе или базе
    • Вопрос задан только что
     
  2. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    дурацкое предположение: настрой keep-alive ну или переоткрывай каждый раз соединение с mysql , это общие предположения, конкретно с мускулом и пхпхой знаком плохо. в 747 строке что?
     
  3. Денис404

    Денис404 Новичок

    С нами с:
    16 июн 2018
    Сообщения:
    15
    Симпатии:
    0
    вывод ошибки подключения к базе, (код ошибки базы выше), дак даже если запрос никуда не идёт крашит( даже если переменная нигде не используется)
     
  4. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    именно по нему я и написал, сервер мускула закрыл соединение, а клиент(библиотека) пытается по нему ломиться.
    в 747 строке файла D:\com\tlogi\websocket\rb.php что?
     
  5. Singlesly

    Singlesly Новичок

    С нами с:
    1 июл 2018
    Сообщения:
    2
    Симпатии:
    0
    Боже какой ужасный год надо городить на PHP для работы с WS.
    Почему бы не добавить в свое приложение где нужны веб-сокеты прослойку node.js, который будет обрабатывать это все нормально. А серверу PHP сделать API для веб сокетов, что бы записывать в БД и совершать прочие операций?