Анонимный чат релиз

Долгожданный релиз стабильной версии анонимного чата с личными сообщениями.

Скачать / Download ws server admin panel v.0.3. & chat v.0.1.

Под катом чат в котором можно пообщаться и испытать его на себе.

Анонимный чат

Правило: позовите друзей и поиграйте в ролевую игру, пытаясь угадать кто есть кто.
Используйте команды /me, /to «Имя».
Пользователей он-лайн: Только вы.

Сообщение:

Что нового

  • Стабильная работа на базе ws-движка проверенного на собственной многопользовательской игре;
  • 100% реализация на классах;
  • websocketserver_class играет исключительно сервисно-транспортную роль, вся логика чата реализована в классе chat_class;
  • Новые пользовательские функции статуса /me и отправки приватного сообщения /to

p.s. релиз на состояние 2014.11.27 не является полноценно оттестированным, рекомендую новые версии.

Мои статьи про PHP демонов и веб-сокеты

  • Иван

    Спасибо! только не пе понятно как пользоваться /to «Имя» /me

    • /me статус
      /to «Имя собеседника в чате» сообщение

  • Иван

    Спасибо но как пользоваться /me, /to «Имя». не понятно))))

  • Николай Приймак

    добрый день муж может вы бы могли реализовать систему комнат для веб socket сервера а то мои попытки оказались тщетны

    • здравствуйте, Николай.
      Всё относительно не сложно, сделайте команды /room «room_name» /close «room_name». На сервере сделайте проверку при разборе сообщения, как она уже сделана на /to /me. В методе создания новой комнаты просто записывайте название комнаты в массив комнат сущности chater. А также где-нибудь храните общий массив где ключ это название комнаты, а значение это количество пользователей в комнате.
      $rooms[‘гостевая’]=>2,
      $rooms[‘трёп’]=>10.

      Вот с клиентом придётся повозиться — нужно будет сделать вкладки на JS, при переключении которых будут отображаться соответствующие area с текстом чата комнаты. Список комнат $chater[‘rooms’] активных для пользователя можно передавать каждый раз при изменении их количества в json как передаётся количество пользователей он-лайн. Отправлять сообщение в комнату также через /room «room_name», сделать чтобы JS дописывал это автоматически когда открыта вкладка комнаты на клиенте.

      • Николай Приймак

        спасибо вам большое за то что вы объяснили как сделать еще раз большое вам спасибо завтра попытаюсь реализовать

  • Gev Hovsepyan

    извините за может быть тупой вопрос. но откуда берется pid который записывается в pid_file. getmypid() возвращает PID от apache. поясните этот момент если не сложно. спасибо

    • Здравствуйте, Gev.
      Я уже немного касался этого вопроса в предыдущих статьях на тему websocket.

      PID это process id, который присваивается системой. Это работает и в Windows и под *nix. Чтобы получить PID достаточно выполнить команду PHP getmypid(), которая вернёт id процесса в системе. По умолчанию действительно, любой скрипт вернёт PID от Apache, но в нашем случае мы выполняем запуск скрипта не через Apache а средствами PHP через консоль. Выполняя команду
      pclose(popen(«start /b w:usrbinphp5.exe -q «.ABSPATH.»init.php», «r»));
      в Windows и
      exec(«php -q «.ABSPATH.»init.php &»);
      под *nix соответственно.
      Т.е. возникает самостоятельный PHP процесс, не связанный с Apache. Поэтому убив его, умрет только работающий скрипт websocket сервера.

  • Николай Приймак

    Invalid argument supplied for foreach() in /var/www/new5.ru/chat/class/websocketserver_class.php on line 432

    не могу даже подключиться к сокету через эхо чат

    • Николай Приймак

      не работает именно эхо клиент( ну и в жопу его))

      • Так эхо клиент и не должен работать с чат сервером. Чат сервер отправляет серверу text сообщения, а чат-сервер работает с json.

        • Николай Приймак

          Тогда удалите файлы(эхо клиент) из архива.

          • Эхо клиент в архиве не для того, чтобы работать с сервером чата, а чтобы тестировать сам веб-сокет не только на живость, но и отправлять команды. И кстати, при разработке чата, я пользовался эхоклиентом чтобы научить сервер работать с командами, отправляя серверу json прямо в строке эхо чата {«act»:»start», «msg»:»Привет всем»} и отлаживать чат на ответах сервера.

  • Николай Приймак

    /to «Имя собеседника в чате» сообщение
    не работает в вашем исходнике((
    а у вас на сайте тоже уже не работает!

    • Николай Приймак

      баг из за двух слов в никах!

      • Это трудно назвать багом, просто в конфиге ники были записаны через  . Поправил в любом случае. Теперь работает даже если набирать имя пользователя через пробел.

  • Николай Приймак

    Помогите реализовать комнаты!

    я делаю так

    в файле chat_class.php

    добавляю
    $this->chater[‘room’] =1;

    после

    $this->chater[‘name’] = $GLOBALS[‘chat’][‘users’][$rnd][‘name’];
    $this->chater[‘color’] = $GLOBALS[‘chat’][‘users’][$rnd][‘color’];

    потом

    if(substr($data[‘msg’],0,9)===»/setroom «){//Выполнение команды setroom
    $msg = substr($data[‘msg’],10);
    $room = substr($msg,0,strpos($msg,»»»));//Выдираем room
    $GLOBALS[‘sessions’][$_uid][«chater»][«room»]=$room;//Сохраняем room
    $msg = $this->msgformat(‘Сохраняем room:’.$room);
    }

    elseif(substr($data[‘msg’],0,11)===»/sendroom «»){//Выполнение команды setroom
    $msg = substr($data[‘msg’],11);
    $toroom = substr($msg,0,strpos($msg,»»»));//Выдираем имя
    if (strlen($toroom)==0) return;//Выбрасываем некорректную команду
    $msg = substr($msg,strlen($toroom)+1);
    $msg = $this->pvtmsgformat($toroom, $msg);
    return $this->sendtoroom(array($this->chater[‘room’], $toroom), «{msg:» ddddd «.$msg.» «}», $_addr);
    }

    после

    if($this->act==’msg’ && isset($data[‘msg’])){
    $data[‘msg’] = urldecode($data[‘msg’]);
    $this->putinsession($_uid);

    $msg = «»;

    Я не могу понять как сделать рассылку всем пользователям с $GLOBALS[‘sessions’][$_uid][«chater»][«room»]=1;

    подскажите как переделать функцию

    public function sendto($arr, $msg, $addr=»»){
    $sendarray = array();
    foreach($GLOBALS[‘sessions’] as $uid => $session){
    if(in_array($session[«chater»][«name»], $arr)){
    $sendarray[$uid]= $msg;
    }
    }
    chat::logmsg(«[«.$addr.»]».substr($msg,6,-2));
    return $sendarray;
    }

    чтобы она выполняла нужную нам задачу!

    • Ну вообще я подразумевал $this->chater[‘room’]- array содержащий массив активных для пользователя комнат, а не число.

      При рассылке, нужно делать проверку: сравнивать в какую комнату отправлено сообщение и то, есть ли в массиве пользователя $this->chater[‘room’] эта комната.

      foreach($GLOBALS[‘sessions’] as $uid => $session){
      if(in_array($room, $session[«chater»][«room»])){
      $sendarray[$uid]= $msg;
      }
      }

      • Николай Приймак

        Спасибо!

  • Николай Приймак

    что за ошибка?
    [07-Dec-2014 08:21:23 UTC] PHP Notice: Undefined offset: 1 in /var/www/new5.ru/chat/class/websocketserver_class.php on line 184

    • см. документацию на http://php.net
      Это не ошибка это неэкранизированная операция которая даёт PHP Notice.

  • Sergej Guruliov

    Не работает на iPhone 🙁 Пока не нашёл причину.

    • Странно. Попробовал на том что было под рукой, смартфоны на Android и планшеты, вообще всё гладко. Нужно смотреть конкретный браузер, должно работать.

      • Sergej Guruliov

        Да Андройд работает а вот iPad iPhone ios 5-7(Safari Chrome) нет. Завтра посмотрю логи.

      • Sergej Guruliov

        iphone
        use different WebSocket versions. For example, Chrome uses
        Sec-WebSocket-Key (and expects Sec-WebSocket-Accept), while Safari sends instead Sec-WebSocket-Key1, Sec-WebSocket-Key2 and a bunch of 8 bytes after the header.

        [ string[18] «Sec-WebSocket-Key1» ] = string[22] «f#24v 9 5[5/_s832P97R»
        [ string[18] «Sec-WebSocket-Key2» ] = string[31] «IE ) 3 37 3* 780 3h y 8>St0»

        private function handshake($connect) { //Функция рукопожатия
        if (empty($info[‘Sec-WebSocket-Key’]))
        return false;

        • Интересная информация. Спасибо.

  • Николай Приймак

    Хром ругается на var json = eval(«(» + e.data + «)»);

    Uncaught SyntaxError: Unexpected identifier

    VM1258:1

    • Николай Приймак

      что делать?

      • Неправильная JSON строка. Исправляйте генерацию на сервере.

        Если это произошло в исходном коде (из архива Скачать / Download ws server admin panel v.0.3. & chat v.0.1.) напишите подробно какие действия и какие версии браузера к этому привели.

  • Тимофей

    Скажите, а можно как-то из php проверить, что вебсокет-соединение в данный момент активно? Проблема следующая. У меня есть php-приложение, а также демон на node.js + socket.io, связующим звеном между ними выступает redis. Работает следующим образом, после аутентификации загружается страница, которая устанавливает вебсокет-соединение с демоном на node.js, после чего пользователь может кликать по различным ссылкам отправляя тем самым обычные ajax-запросы веб-серверу и получать данные, но прежде чем отдать данные, нужно из php как-то проверить, что вебсокет-соединение всё еще живо, а если нет, то сообщить пользователю что произошел разрыв связи и нужно переподключиться. Как это можно сделать? Спасибо.

    • Честно скажу, что вряд ли смогу с этим помочь.
      Напишите что у вас с одной стороны веб-сокета и что с другой. Распишите по блокам, пока не очень понятно зачем вообще AJAX, когда есть WS.

      • Тимофей

        У меня обычное php-приложение на php-фреймворке реализующее паттерн mvc, в это приложение нужно всего лишь добавить немного реал-тайма, для этого я взял модуль socket.io (http://socket.io) для node.js, этот модуль идет с client и server api для ws, на стороне клиента достаточно подключить js-файл из этой библиотеки и затем можно подписываться на события ws-сервера или выбрасывать события для ws-сервера. Затем с помощью этой же библиотеки (server api) пишется серверная часть для ws на node.js.

        Затем как промежуточное звено между php-приложением и демоном на node.js ставится redis, через который они могут обмениваться данными друг с другом.

        Работает всё это следующим образом. Когда пользователь аутентифицируется на сайте, то php-приложение пишет в redis и куки браузера идентификатор сессии, затем рендерится html-страница, которая представляет из себя по-сути 2 больших блока, в одном из которых чат, а в другом контент который будет грузиться по ajax (когда кликаем по ссылкам на сайте), для чата ws нужны, а для контента не нужны. После рендеринга страницы запрашивается коннект к ws-серверу. Ws-сервер сверяет идентификатор сессии в куках браузера с тем, что находится в redis и если они совпадают то устанавливает соединение с клиентом (handshake).

        Всё теперь чат работает с помощью ws, а кроме этого пользователь также может использовать обычное php-mvc-приложение чтобы получать некоторые данные через ajax просто нажимая разные интересные ссылочки на сайте и подгружать данные в другой блок страницы.

        Теперь осталось сделать так, чтобы если вдруг вебсокет-соединение упало, то ajax-запросы к обычному php-приложению тоже бы не проходили, а вместо этого в ответ на ajax-запрос приходило бы сообщение, что сокет-соединение пропало и вы должны переподключиться если хотите.

        Как я это вижу. После того, как ws-сервер соединился с клиентом, то id-сокета записывается в redis с ключем id-юзера, а когда происходит дисконнект то наоборот удаляется из redis, тогда в php-приложении перед тем как отдать данные на ajax-запрос, проверяется существование id-сокета по id-юзера в redis и если его не существует, то значит произошел разрыв и пользователю нужно в ответ показывать сообщение об ошибке соединения с сервером.

        В итоге приложение использует

        php-фреймворк + библиотека для работы с redis
        node.js + модуль socket.io + модуль для работы redis

        Первый как описано выше используется для обычных ajax-запросов, в то время как на node.js и socket.io реализуется серверная и клиентская часть для ws, чтобы добавить к php-приложению немного реал-тайма (чат).

        Извините что написал целую статью, старался подробнее объяснить. Нагуглить не очень получается на эту тему. В том числе я не знаю насколько жизнеспособно мое решение и есть ли другие варианты.

        • accncc

          не усложняйте себе жизнь сделайте проверку по таймеру отправляйте каждую секунду сокету сообщение если в обратку вы не получите сообщение что значит произошел разрыв и устанавливает соединение заново простите за кривой набор текста но это голосовой набор удачи!

        • >Как я это вижу. После того, как ws-сервер соединился с клиентом, то
          >id-сокета записывается в redis с ключем id-юзера, а когда происходит
          >дисконнект то наоборот удаляется из redis, тогда в php-приложении >перед
          тем как отдать данные на ajax-запрос, проверяется >существование
          id-сокета по id-юзера в redis и если его не существует, >то значит
          произошел разрыв и пользователю нужно в ответ показывать
          >сообщение об
          ошибке соединения с сервером.

          Это решение выглядит вполне логично. Я никогда не использовал редис, ну кроме как для салатов (шучу). На самом деле действительно не знаком с Redis, если эта штука быстро отдаёт PHP данные AJAX обработчику о том, жива ли сессия или нет, то тогда действительно почему бы и нет.

          Решение, которое ниже предлагает _accncc_ я не понял.
          -Если такую проверку делать на клиенте и запрещать работать AJAX если нет соединения WS, то есть вероятность хоть и очень малая что AJAX полетит сразу после той проверки которая сказала ОК, а соединение оборвалось. Конечно, скорее всего второй AJAX уже не долетит, но такой момент может возникнуть + всё же если 100 клиентов будут тыкать в WS 1 раз в секунду он может и не напряжется, а что если их будет 1 000, 10 000?

          -Если такую проверку делать на сервере, это всё равно не избавляет от использования Redis и id.

          Моё предложение может быть затратно по времени имплементации но решит сразу несколько задач. На сервере не нужен будет огород с редисом и node.js. Я бы взял и использовал для этих целей WS на PHP (да, он не так хорош, как node.js с готовым модулем) но раз уж система на PHP то почему бы и нет? Тем более для фреймворков типа Yii или Симфони на просторах сети встречал реализации. PHP который отвечает на AJAX сможет легко общаться с демоном на PHP с помощью сигналов или других инструментов.

          • Тимофей

            Спасибо, понял. В теории, редис должен быстро отдавать данные, поскольку это key-value хранилище, все данные хранятся в оперативной памяти. Решение, которое предлагает accncc, я тоже не понял.

            Очень было бы интересно почитать статью о реализации общения между небольшим php-приложением (ajax) и php-демоном, например, чтобы тот же Yii прекращал отдавать данные, если вдруг вебсокет-соединение упало. Информации об этом я не смог найти. Поэтому если бы такая информация появилась в рунете у вас на блоге или хабре, было бы просто замечательно. Спасибо.

          • Борис Шаталов

            я проверяю на php следующим образом:

            function get_content($hostname, $path)
            {
            $line=»;
            $fd=fsockopen($hostname, 8002, $errno, $errstr, 30);
            if(!$fd)
            echo «$errstr ($errno)n»;
            else
            {
            $headers=»GET $path HTTP/1.1rn»;
            $headers.=»Host: $hostnamern»;
            $headers.=»Connection: Closernrn»;
            fwrite ($fd, $headers);
            fclose($fd);
            }
            return $line;
            }

            $hostname=»tcp://your_ip»;
            $path=»/»;
            set_time_limit(10);

            get_content($hostname, $path);

            соответственно если все ок, то подключение не вызывает ошибки. сам видел решение про которое вы говорите, но позже нашел более простое.

          • На сколько я понял этот скрипт пригоден для проверки соединения между PHP и демоном node.js но не пригоден для проверки соединения в сессии между node.js и клиентом, а в данном случае стоит задача именно проверки на стороне PHP соединения между клиентом и демоном на node.js

          • Тимофей

            Неподойдет, мне нужно убедиться, что отдельно взятое вебсокет-соединение активно, а этот код проверяет только то, что демон вообще впринципе работает.

          • У меня есть игровой проект Growing Crystals на Yii, всё общение между фреймворком и демоном происходит через БД.

          • Тимофей

            Ну оно так и получается, php-фреймворк общается с node.js демоном через БД redis.

  • Саня Коваль

    Привет! Пытаюсь запустить чат из исходников этой статьи, вылазит такая проблема:
    Подключение по ws происходит только с локальной машины (сервер запущен на отдельной машине с Linux), админка работает нормально с любой машины, а ws даже telnet-ом не подключается. Рылся во всех настройках которые нашел, ничего не могу сделать… Может подскажете что то?

    • Смотрите настройки файрволла, больше нечего подсказать.

      • Саня Коваль

        Смотрел уже… На сервере в iptables всё разрешено, на машине с браузером брандмауэр выключен… В логах iptables я вижу запросы и от локальной машины и от удаленной. Да и эхо сервер работал. Такое чувство что проблемы с созданием сокета (похожая ерунда была если неправильно указать адрес в socket_bind).
        netstat выдает такую ерунду:
        tcp 0 0 127.0.1.1:8889 0.0.0.0:* LISTEN 2887/php
        в то же время к примеру для vsftpd (который работает) вывод такой:
        tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1002/vsftpd
        Так вот, вопрос, где задается этот самый Local Address и влияет ли он на что то?

        UPD: разобрался частично, если в $config писать ‘host’ => ‘0.0.0.0’, вместо ‘host’ => $GLOBALS[‘ws’][‘addr’], то всё работает, вот только мне что то кажется что это не совсем правильно, раз у остальных работает с реальным ip

        • Меня смущает адрес 127.0.1.1, т.к. localhost это 127.0.0.1

          • Саня Коваль

            Та не, с этим как раз всё в порядке, это особенность дебиана/бубунты. Вообще локалхост 127.0.0.1 — 127.255.255.255, могут любые использоваться. Экспериментально выяснил что если поставить localhost то работает только на локальной машине, если реальный айпишник поставить, то работает только удаленно, а если 0.0.0.0 то и локально и удаленно. Вот такая ерунда.

  • Сергей

    Спасибо за статью, попробую прикрутить WS у себя на сайте к системе оповещения о новом заказе…

    Кстати, может будет вам полезно, сейчас в админке комментариев Disqus есть возможность установить русский язык. Здесь все служебные слова на русском будут отображаться.

  • a. looze

    Рекомендую добавить в статью информацию по правам на запись в папки log и pid. Не везде настройки по умолчанию позволяют веб-серверу писать в папки, загруженные по ftp

    Спасибо за проделанную работу

    • Ну это у кого как права настроены. Да, PHP нужно дать возможность работать с лог-файлами и файлами процессов pid.

  • lorad

    всем привет, а как запустить сокет на https?

    пробовал в классе менять tcp:// на ssl://
    и в node.jx ws:// на wss://
    все равно не хочет открываться

    • Не смогу помочь. Не занимался этим вопросом, если кто-то из пользователей подскажет, было бы хорошо. Голосую за ваш вопрос.

      • Maxim

        Зачем парню ваша реализация, если node.js предназначен для асинхронной информации

        • Уточните ваш комментарий, непонятно что вы имеете ввиду.

  • YAn Kalnin

    как https запустить?

  • Elena Frolova

    Не подскажите, как yii2 прикрутить? Маленько логику бы понять. Пока просто закинула папку. Сообщения отправляются, но обратно не приходит ответ. На локалке работает.

    • Я написал относительно большой проект в котором использовал Yii 1 и технологию WS. http://petukhovsky.com/growing-crystals-vol-15-web-site-and-yii/
      Не уверен что статья поможет. Основная идея использования WS в Yii была в том, что обмен данными происходит через БД а WS это отдельный PHP демон, не связанный напрямую с Yii.

      • Elena Frolova

        Может нужно какую-то команду прописать, чтобы веб сокет сервер заработал на хостинге? На опенсервере просто работает. Закинула в папку chat все. В .htaccess прописала, чтобы ссылку на эту папку обрабатывал нормально, не переделывая. Похоже что не видит, что по адресу находится сокет сервер.

        • WS не должен ни как зависеть от фреймворка. Смотрите порты. Как тестировать хостинг и порты на работу, написано в первой статье.

  • Артем

    Приветствую! подскажите а как остановить работу сокета?

    • Это есть в статьях http://petukhovsky.com/tag/websocket/ в частности работа прекращается в программе управления сокетом. Просто убивается процесс.

  • Артем

    Приветствую! подскажите а как остановить работу сокета?

  • srt

    Здравствуйте

    отсутствует заголовок CORS ‘Access-Control-Allow-Origin’

    как исправить?

    • Не знаю в каком контексте происходит эта ошибка. Пробуйте пройтись по всем этапам описанным в статьях по порядку.

      • srt

        Привет.
        Спасибо за отклик.
        Нашёл я причину.
        У меня свой сервер на дебике, в настройках указывать нужно разрешения для доменов оказывается.
        Както так для nginx-а:

        add_header ‘Access-Control-Allow-Origin’ ‘http://www.site.ru’;
        add_header ‘Access-Control-Allow-Credentials’ ‘true’;
        add_header ‘Access-Control-Allow-Methods’ ‘POST,GET,PUT’;

        для Node.js, PHP и тд, не искал, думаю что-то подобное в настройках имеется.

        • Спасибо. Надеюсь для кого-нибудь это будет полезно.

  • Артем

    Привет, напиши строку php скрипта которая остановит веб сокет, в твоих статьях много текста, сам скрипт не нашел. Спасибо за полезную инфу

    • Артём, советую всё же внимательнее прочитать все статьи и разобрать библиотеку управления ws. Убить текущий процесс можно стандартной командой exit();, не забыв предварительно закрыть работу с потоком fclose($this->server);

  • Саша Добровольский

    Большое спасибо за этот замечательный чат,у меня такой вопрос, по поводу имени отправителя. У меня есть файл index.php, в нем я записываю сессию пользователя( имя,логин и т.д), как можно передать эту сессию ($_SESSION[‘name’]) в конфиг.файл chat.cfg.php

  • ViZeR

    А Вы задумывались, почему библиотеки для работы с вебсокетами такие громоздкие? Насколько кроссбраузерным получился ваш код?!

    • Мне кажется что библиотека не громоздкая. Реализация протокола не бывает «в одну строку».
      Что касается вопроса кроссбраузерности, сейчас практически все браузеры поддерживают технологию веб-сокетов IE10+, FF11+, Chrome 16+,
      Safari 6+, Opera 12.5+. И даже в старых версиях FF, Chrome, Safari, Opera
      есть поддержка протокола в том или ином виде.

  • dimaaa15

    Вообще отличный чат, почти все работает. Только вот как интегрировать его на сайт ни слова…. Жаль..

  • dimaaa15

    Чат не работает в браузерах IE7, IE8, IE9 как можно побороть эту напасть?

    • dimaaa15

      А именно похоже не работает socket = new WebSocket(chataddr); в chat.js Может как то с помощью php принимать новое соединение и производить рукопожатие??

      • Так ничего удивительного. Они в базовой версии и не должны поддерживать. WS, Microsoft должна была выпускать обновления на эту тему, но главный вопрос зачем, доля этих браузеров менее 5% на всех и будет сокращаться

  • dimaaa15

    Подскажите пожалуйста как можно передать cookies сайта??

    • Странный вопрос. Вы же в браузерной сессии генерируя средствами PHP страницу выдачи можете прочесть coockie и передать в том виде, в котором вы хотите.

      • dimaaa15

        Да я запутался и не совсем еще понимаю данную технологию. При рукопожатии переменная $_cookie пустая

        • На веб-сокет сервере куки не существуют, т.к. веб-сокет сервер ничего не знает о сессии просмотра страниц, зато cookies известны браузеру и веб-серверу, который генерирует страницу. Вы можете прочесть cookie средствами PHP во время генерации страницы для пользователя и средствами JavaScript на клиенте. Если вы спрашиваете об этом, чтобы авторизовать клиента в ws сервере, то используйте токены. Например в базе есть пользователь UserX, то в момент загрузки страницы с ws-клиентом, имеет смысл в том или ином виде передавать этот токен, лучше по https, и когда клиентское ws-приложение авторизуется на ws сервере, этот токен должен служить авторизацией, чтобы ws-сервер по токену в БД понял что это UserX.

          • dimaaa15

            Спасибо, спустя 8 дней понял, что Вы имеете ввиду. Понял бы сразу, если бы Вы просто сказали, что различные параметры можно передать в УРЛ в new WebSocket(chataddr);

  • dimaaa15

    Здравствуйте. Можно ли сделать так, что бы сообщения в чате доставлялись только при открытой активной вкладке чатера. Т. е. если пользователь переключился на другую вкладку, сообщения в чате перестанут ему приходить, когда он вернется обратно к этой вкладке сообщения будут приходить???

  • Hunter

    Пользователей он-лайн: 5. при нажатии F5 постоянно счетчик прибавляется

    • Это логично: т.к. это неавторизованные пользователи, и под каждого зашедшего на страницу создаётся новый пользователь и новое соединение в WS, при чём старое соединение отвалится, но не сразу а в течение секунд 20 может меньше (не помню), т.к. при обновлении страницы JS не говорит серверу что уходит из чата. В проектах где есть авторизация — можно обновлять страницу — пользователь и всё остальное останется. В данном случае я не стал привязывать пользователей ни к кукам ни тем более к авторизации.

      • Hunter

        подскажите пожалуйста,а где можно посмотреть пример с авторизацией по сессиям или куки?

        • Нету примера именно с куками. Но посмотрите статью, где-то была из последних на тему разработки игры Growing Crystals. Я там делал авторизацию пользователя в веб-сокете, по данным сессии (_SESSION). Точно также как в сессии можно хранить в куках ключ авторизации на сокете, и передавать при подключении. Но реализация довольно трудоёмкая и, кстати, безопасность не самая высокая.

  • Hunter

    Подскажите пожалуйста,как реализовать все с mysql. Что б сообщения не рассылалось всем клиентам,а выводилось им последнее и базы данных

    • В демоне подключайтесь к БД. Не забывайте использовать только mysql_pconnect(), вместо обычного. А при подключении нового юзера вытаскивайте из БД последние сообщения для него.

  • dimaaa15

    На локальной машине (денвер) все нормально работает: сервер стартует и останавливается как нужно по клике на кнопку. Перенес все это дело на хостинг и тут начались проблемы. Сначала сервер ни как не хотел сам стартовать. Запустился он только после того как в браузере набрал путь до файла init.php, но останавливаться никак не хочет. В строке $connect = socket_connect($socket, $GLOBALS[‘ws’][‘addr’], $GLOBALS[‘ws’][‘port’]); файла wsadmin.php появляется ошибка Warning: socket_connect() [function.socket-connect]: unable to connect [111]: В соединении отказано in /home/host1/site.ru/htdocs/www/include/socket/wsadmin.php on line 91. В общем сервер не стартует нормально, ни останавливается. Прошу помощи.

    • Для того, чтобы стартовал попробуйте залогиниться на сервере через SSH под SU/root. Я где-то писал о том, что нужно PHP запускать из-под root.
      Скорее всего вы запустили несколько процессов, если не остановить правильно и запустить еще один демон — может получиться каша.

      • dimaaa15

        Да, скорее всего запущено несколько процессов, может хостера попросить перезагрузить сервер?

        • Крайняя статья про веб-сокеты была именно про хостинг. Вообще для проекта хостинг в виде хостинга — не лучшая идея. Лучше самую дешевую VDS-ку взять под эти нужды.

          • dimaaa15

            Да спасибо. Списался с тех. поддержкой хостинга. Они ответили, что данный скрипт работать у них не будет. Нужен VDS. Хотя скрипт проверяющий работу сокетов, говорит, что все ОК.

            if(extension_loaded(‘sockets’))
            echo «WebSockets OK»;
            else
            echo «WebSockets UNAVAILABLE»;

  • dimaaa15

    Не работает данный код на ubuntu, 2 месяца коту под хвост. Уж лучше изучить javascript и фрэймворки чем пытаться запустить это

    • Дмитрий, что у вас не получается, на каком этапе не работает? Вы же писали.

      dimaaa15 •6 months ago
      Вообще отличный чат, почти все работает. Только вот как интегрировать его на сайт ни слова…. Жаль..

      • dimaaa15

        Это на денвере все нормально. В убунту не стартует сервер

        • Вы прошли отладочный цикл как описано в первой статье? На каком этапе не удалось запуститься?

          • dimaaa15

            запускаю http://192.168.0.123/simpleworking.php, в http://192.168.0.123/socket.html делаю реконнект предварительно прописав в Server address: ws://192.168.0.123:889
            В этом же файле в консоле ошибка WebSocket connection to ‘ws://192.168.0.123:889/’ failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

          • 1. Вы убедились что WS скрипт на сервере запускается? А не вываливается в связи с занятостью портов или по ряду других причин описанных в первой статье?

            2. 90% что порт который вы используете закрыт. Лучше всего брать из четырехзначного диапазона как в примере чата.

            Еще раз повторюсь, просмотрите внимательно все статьи. Вам для начала нужно убедиться что WS запускается на сервере (см. ошибки PHP, ошибки в логах). Затем попробовать достучаться используя Telnet, если не получается значит проблема в том, что порты невидны. И тут вам нужно разбираться уже с настройками сервера и файрвола хостинг провайдера.

  • dimaaa15

    Что может быть такое? Оставляю запущенным на 1-2 дня сервер сокетов (никто им не пользуется) и через это время сообщения уже не отправляются. После перезагрузки опять отправляются. В файле логов ничего подозрительно нет.

    • К сожалению может быть что угодно. Сервер может дропать процесс по разным причинам: крэш в коде, по расписанию, да и банально в результате перезагрузки. Это нужно смотреть на уровне сервера, ни как не PHP, если в нём нет явных проблем.