workman PHPSocket.IO文檔


安裝

請使用composer集成phpsocket.io。

腳本中引用vendor中的autoload.php實現SocketIO相關類的加載。例如

require_once '/你的vendor路徑/autoload.php';

服務端和客戶端連接

創建一個SocketIO服務端

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

// 創建socket.io服務端,監聽3120端口
$io = new SocketIO(3120);
// 當有客戶端連接時打印一行文字
$io->on('connection', function($socket)use($io){
  echo "new connection coming\n";
});

Worker::runAll();

客戶端

<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script>
// 如果服務端不在本機,請把127.0.0.1改成服務端ip
var socket = io('http://127.0.0.1:3120');
// 當連接服務端成功時觸發connect默認事件
socket.on('connect', function(){
    console.log('connect success');
});
</script>

自定義事件

socket.io主要是通過事件來進行通訊交互的。

socket連接除了自帶的connect,message,disconnect三個事件以外,在服務端和客戶端開發者可以自定義其它事件。

服務端和客戶端都通過emit方法觸發對端的事件。

例如下面的代碼在服務端定義了一個chat message事件,事件參數為$msg

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

$io = new SocketIO(3120);
// 當有客戶端連接時
$io->on('connection', function($socket)use($io){
  // 定義chat message事件回調函數
  $socket->on('chat message', function($msg)use($io){
    // 觸發所有客戶端定義的chat message from server事件
    $io->emit('chat message from server', $msg);
  });
});
Worker::runAll();

客戶端通過下面的方法觸發服務端的chat message事件。

<script src='//cdn.bootcss.com/socket.io/1.3.7/socket.io.js'></script>
<script>
// 連接服務端
var socket = io('http://127.0.0.1:3120');
// 觸發服務端的chat message事件
socket.emit('chat message', '這個是消息內容...');
// 服務端通過emit('chat message from server', $msg)觸發客戶端的chat message from server事件
socket.on('chat message from server', function(msg){
    console.log('get message:' + msg + ' from server');
});
</script>

workerStart事件

phpsocket.io提供了workerStart事件回調,也就是當進程啟動后准備好接受客戶端鏈接時觸發的回調。
一個進程生命周期只會觸發一次。可以在這里設置一些全局的事情,比如開一個新的Worker端口等等。

require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

$io = new SocketIO(9120);

// 監聽一個http端口,通過http協議訪問這個端口可以向所有客戶端推送數據(url類似http://ip:9191?msg=xxxx)
$io->on('workerStart', function()use($io) {
    $inner_http_worker = new Worker('http://0.0.0.0:9191');
    $inner_http_worker->onMessage = function($http_connection, $data)use($io){
        if(!isset($_GET['msg'])) {
            return $http_connection->send('fail, $_GET["msg"] not found');
        }
        $io->emit('chat message', $_GET['msg']);
        $http_connection->send('ok');
    };
    $inner_http_worker->listen();
});

// 當有客戶端連接時
$io->on('connection', function($socket)use($io){
  // 定義chat message事件回調函數
  $socket->on('chat message', function($msg)use($io){
    // 觸發所有客戶端定義的chat message from server事件
    $io->emit('chat message from server', $msg);
  });
});

Worker::runAll();

phpsocket.io啟動后開內部http端口通過phpsocket.io向客戶端推送數據參考 web-msg-sender

分組

socket.io提供分組功能,允許向某個分組發送事件,例如向某個房間廣播數據。

1、加入分組(一個連接可以加入多個分組)

$socket->join('group name');

2、離開分組(連接斷開時會自動從分組中離開)

$socket->leave('group name');

向客戶端發送事件的各種方法

\(io是SocketIO對象。\)socket是客戶端連接

\(data可以是數字和字符串,也可以是數組。當\)data是數組時,客戶端會自動轉換為javascript對象。

同理如果客戶端向服務端emit某個事件傳遞的是一個javascript對象,在服務端接收時會自動轉換為php數組。

1、向當前客戶端發送事件

$socket->emit('event name', $data);

2、向所有客戶端發送事件

$io->emit('event name', $data);

3、向所有客戶端發送事件,但不包括當前連接。

$socket->broadcast->emit('event name', $data);

4、向某個分組的所有客戶端發送事件

$io->to('group name')->emit('event name', $data);

獲取客戶端ip

$io->on('connection', function($socket)use($io){
        var_dump($socket->conn->remoteAddress);
});

關閉鏈接

$socket->disconnect();

限制連接域名

當我們想指定特定域名的頁面才能連接,可以用$io->origins方法來設置域名白名單。

$io = new SocketIO(2020);
$io->origins('http://example.com:8080');

多個域名時用空格分隔,類似

$io = new SocketIO(2020);
$io->origins('http://workerman.net http://www.workerman.net');

支持SSL(https wss)

SSL支持有兩種方法,workerman原生和nginx代理

workerman原生支持

SSL 要求workerman>=3.3.7 phpsocket.io>=1.1.1

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use PHPSocketIO\SocketIO;

// 傳入ssl選項,包含證書的路徑
$context = array(
    'ssl' => array(
        'local_cert'  => '/your/path/of/server.pem',
        'local_pk'    => '/your/path/of/server.key',
        'verify_peer' => false,
    )
);
$io = new SocketIO(2120, $context);

$io->on('connection', function($socket)use($io){
  echo "new connection coming\n";
});

Worker::runAll();

注意:

1、證書是要驗證域名的,所以客戶端鏈接時要指定域名才能順利的建立鏈接。

2、客戶端連接時不能再用http方式,要改成https類似下面這樣。

<script>
var socket = io('https://yoursite.com:2120');
//.....
</script>

nginx代理SSL

前提條件及准備工作:

1、已經安裝nginx,版本不低於1.3

2、假設phpsocket.io監聽的是2120端口

3、已經申請了證書(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下

4、打算利用nginx開啟443端口對外提供ssl代理服務(端口可以根據需要修改)

nginx配置類似如下:

server {
  listen 443;

  ssl on;
  ssl_certificate /etc/ssl/server.pem;
  ssl_certificate_key /etc/ssl/server.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

  location /socket.io
  {
    proxy_pass http://127.0.0.1:2120;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header X-Real-IP $remote_addr;
  }

  # location / {} 站點的其它配置...
}

注意:

1、證書是要驗證域名的,所以客戶端鏈接時要指定域名才能順利的建立鏈接。

2、客戶端連接時不能再用http方式,要改成https類似下面這樣。

<script>
var socket = io('https://yoursite.com');
//.....
</scrip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM