
Workerman如何建立一個wss服務,讓客戶端可以使用wss協來連接通訊,例如在微信小程式中連接服務端。
#答案:
wss協定實際上是websocket SSL,就是在websocket協定上加入SSL層,類似https(http SSL)。
所以只需要在websocket協定的基礎上開啟SSL即可支援wss協定。 (建議學習: workerman教學)
直接用Workerman開啟SSL
準備工作:
#1、Workerman版本不小於3.3.7
2、PHP安裝了openssl擴充功能
3、已經申請了憑證(pem/crt檔及key檔)放在磁碟任意目錄
程式碼:
<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '磁盘路径/server.pem', // 也可以是crt文件
'local_pk' => '磁盘路径/server.key',
'verify_peer' => false,
// 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker('websocket://0.0.0.0:443', $context);
// 设置transport开启ssl,websocket+ssl即wss
$worker->transport = 'ssl';
$worker->onMessage = function($con, $msg) {
$con->send('ok');
};
Worker::runAll();透過以上的程式碼,Workerman就監聽了wss協議,客戶端就可以透過wss協定來連接workerman實現安全即時通訊了。
測試
開啟chrome瀏覽器,按F12開啟偵錯控制台,在Console一欄輸入(或將下面程式碼放入到html頁面用js執行)
// 证书是会检查域名的,请使用域名连接
ws = new WebSocket("wss://域名");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};注意:
1、如果無法啟動,則一般是443端口被佔用,請改成其它端口,注意改成其它端口後客戶端連接時需帶上連接埠號,客戶端連線時位址類似wss://domain.com:xxx ,xxx為連接埠號碼。如果必須使用443埠請使用方法二代理的方式實作wss。
2、wss連接埠只能透過wss協定訪問,ws無法存取wss連接埠。
3、憑證一般是與網域綁定的,所以測試的時候客戶端請使用網域連接,不要使用ip去連。
4、如果出現無法存取的情況,請檢查伺服器防火牆。
5、此方法要求PHP版本>=5.6,因為微信小程式要求tls1.2,而PHP5.6以下版本不支援tls1.2。
以上是workerman怎麼配置wss的詳細內容。更多資訊請關注PHP中文網其他相關文章!