Мы работаем! Пишите WhatsApp / Viber / Telegram: +7 951 127-23-57, Skype: creograf

WebSocket + phpDaemon

WebSocket + phpDaemon

10:54:19 04.05.2013 Комментарии: 0

WebSocket + phpDaemon

установка phpDaemon в Debian

1) обновить php до 5.4

1
apt-get update && apt-get -y upgrade && apt-get -y install mc htop

Подключаем репозитории Dotdeb, для того что бы установить PHP5.4 + PHP-FPM:
Добавьте в файл: /etc/apt/sources.list следующие строки:

1
2
deb http://packages.dotdeb.org squeeze all
deb-src http://packages.dotdeb.org squeeze all

Для инсталяции PHP 5.4 на Debian 6.0 "Squeeze" нужно добавить строки:

1
2
deb http://packages.dotdeb.org squeeze-php54 all
deb-src http://packages.dotdeb.org squeeze-php54 all

Установите ключи доступа к репозиторию GnuPG key

1
2
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -

Обновите систему:

1
2
3
apt-get update && apt-get -y upgrade
apt-get -y install php5-fpm php5-gd php5-curl php5-mcrypt php5-json
php5-apc php5-mysql

2) Библиотеки

1
2
3
4
5
6
7
8
apt-get install libevent-dev
#или
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xzf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable.tar.gz
./configure --prefix=/usr/libevent
make
make install
1
2
3
4
pecl install http://pecl.php.net/get/eio-1.2.1.tgz
pecl install channel://pecl.php.net/libevent-0.0.5
pecl install http://pecl.php.net/get/event-1.6.0.tgz
pecl install channel://pecl.php.net/proctitle-0.1.2
1
2
3
echo "extension=eio.so" > /etc/php5/conf.d/eio.ini
echo "extension=event.so" > /etc/php5/conf.d/event.ini
echo "extension=proctitle.so" > /etc/php5/conf.d/proctitle.ini

Узнать какой конфиг файл используется можно командой:

1
php -i | grep "Loaded"

в этом php.ini

1
date.timezone = "Europe/Moscow" ; или любую другую зону

3) установка phpdaemon в /usr/local/phpdaemon

1
2
cd /usr/local/
git clone https://github.com/kakserpom/phpdaemon.git

Конфиги лежат в /usr/local/phpdaemon/conf/ и /usr/local/phpdaemon/conf/conf.d/.

Копируем конфиги:

1
2
3
4
mkdir /etc/phpdaemon
cp /usr/local/phpdaemon/conf/phpd.conf.example /etc/phpdaemon/phpd.conf
cp /usr/local/phpdaemon/conf/AppResolver.php /etc/phpdaemon/
cp -rp /usr/local/phpdaemon/conf/conf.d /etc/phpdaemon/
1
2
ln -s /usr/bin/phpd /etc/init.d/phpd
update-rc.d phpd defaults

phpd restart --verbost-tty=1
- ошибки будут показаны в консоли

4) Ошибка в логах /var/log/phpdaemon:

1
[PHPD] WebSocketSession::onHandshake: undefined route '...'.

Значит, что файл WebSocketSession.php скорее всего не найден в папках /usr/local/phpdaemon/applications или /usr/local/phpdaemon/app-web и т.д.

 

Пример:

В настоящее время WebSocket через HTML поддерживается в следующих браузерах:
Google Chrome (начиная с версии 4.0.249.0);
Apple Safari (начиная с версии 5.0.7533.16);
Mozilla Firefox (начиная с версии 4);
Opera (начиная с версии 10.70 9067);
Internet Explorer (начиная с версии 10 PP5);

1) Конфиг
/etc/phpdaemon/phpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
user user;  #пользователь, из-под которого запускаться
group user;
 
max-workers 1;
min-workers 1;
start-workers   1;
max-idle    0;
log-signals 1;
 
appfilepath "/usr/local/phpdeamon/applications/%s.php"; #где лежат приложения
 
Pool:WebSocketServer {
 enable 1;
 listen "tcp://0.0.0.0";
 listen-port 8047;
 privileged;
}
 
#приложения с настройками
ExampleWebSocket{}
IMWebSocket {}
WebSocketWorker{}
IM2{}
#MyWebSocket {}
 
include conf.d/*.conf;

2) пример приложения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  class IM2 extends AppInstance {
        public $ws;
        public $persons_id = array();   //phpDaemon_id=>person_id
        public $sessCounter = 0;
        public $sessions = array();
         
        public function onReady() {
            $appInstance = $this;
 
            WebSocketServer::getInstance()->addRoute('im', function ($client) use ($appInstance) {
                $session=new IM2Session($client, $appInstance);
                return $session;
            });
                  
        }
         
        public function onHandshake($client) {
        }
 
        public function openSession($client) {
        }
 
        public function sendIM2Client($params) {
            if(isset($this->persons_id[$params['to']])){
                Daemon::log("sendFrame to ".$params['to']);//отладка
                $this->persons_id[$params['to']]->sendFrame($params['html'], 'STRING');
            }
        }
         
    }
 
    class IM2Session extends WebSocketRoute {
        public $person_id;
        public $id;
        public $client;
        public $appInstance;
          
        public function __construct($client,$appInstance) {
                $this->client = $client;
                $this->appInstance = $appInstance;
        }
 
        public function onFrame($data_src,$type) {
            $data = json_decode($data_src,TRUE);
                 
            if (!$data) {
                return;
            }
            $cmd = $data['action'];
             
            if (($cmd === 'setMyId') && isset($data['id']))  {
                 
                $cur_client=$this->client;
                $this->appInstance->persons_id[$data['id']]=$cur_client;
                $this->person_id=$data['id'];
                 
                Daemon::log('IM2 setMyId '.$data['id']); //отладка, покажется в логах
                 
            } else if($cmd === 'message'){
                //$this->client->sendFrame($data['html']);
                Daemon::log("IM2 message ".$data_src);
                $this->appInstance->sendIM2Client($data);
            } else{
                $this->client->sendFrame('test', 'STRING',    function($client) {
                        Daemon::log('IM2 test');
                    });
            }
        }
         
        public function onFinish() {
            unset($this->appInstance->persons_id[$this->person_id]);
            unset($this->appInstance->sessions[$this->id]);
        }
         
    }
?>

3) im.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
wSocket={
    ws: [],
    "person_id": null,
    createSocket: function(id) {
            /*this.ws = new WebSocketConnection({
                url: {
                    ws      : 'ws://' + document.domain + ':8047/im',
                },
                root : '/js/websocket'
            });*/
            this.person_id=id;
            var person_id=id;
            var wSocket=this;
 
            this.ws=new WebSocket('ws://site.com:8047/im');
             
            this.ws.onopen = function() {
                console.log('WebSocket opened ');
                if(person_id > 0){
                    console.log(person_id);
                    wSocket.setMyId(person_id);
                }
            }
 
            this.ws.onmessage = function(e) {
                console.log ('WebSocket message: ' + e.data);
                $("#im_content .newmessages").append(e.data);
                $("#im_content").scrollTo("100%",1);
            }
 
            this.ws.onclose = function() {
                console.log('WebSocket closed');
            }
    },
 
    //установить свой person_id клиент клиенту в websocket
    setMyId: function(id){
        var params={
                "action" : "setMyId",
                "id":id,
            };
        this.ws.send(JSON.stringify(params));
         
        if(this.person_id==null){
            this.person_id=id;
        }
    },
         
    //отправить сообщение
    sendIM : function (params){
        params["action"]="message";
        /*  var msg = {
            action: "message",
            html: document.getElementById("text").value,
            from: clientFROM_id,
            to: clientTO_id,
            date: Date.now()
          };*/
        this.ws.send(JSON.stringify({
            "action" : "setMyId",
            "id":from,
        }))
        this.ws.send(JSON.stringify(params));
    }
}

4) html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
<form method="post" action="/..." id="..." to="14" class="message_post">
      <textarea name="body" id="text">textarea>
        <input type="hidden" name="to" id="to" value="14">
        <input type="hidden" name="from" id="from" value="12">
        <button type="submit" id="comment_send"?>отправитьbutton>
form>
...
<script>
$(document).ready(function(){
    wSocket.createSocket("php echo $_SESSION['id']?>");
    $("form.message_post").ajaxForm({
            "success":function(data,statusText,xhr,$form){
            to=$("#to").attr("value");
            from=$("#from").attr("value");
                $("#im_content .newmessages").append(data);
                $("#im_content").scrollTo("100%",1);
                //отправить сообщение через websocket
                from=$("#from").attr("value");
                wSocket.sendIM({"html": data,
                        "to": to,
                        "from": from});
            }});
 
});
script>

 

 

Похожие записи

Вы можете оставить
комментарий



    
© 2002-2022 Креограф. Все права защищены законом РФ
 Русский /  English