
WebSocket + phpDaemon
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-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
|
|
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.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" >
|