tp5 think-swoole websocket開啓ssl wss可以請求

新開發發的項目用戶端是公衆號和小程序,小程序只支持wss鏈接,以下是我的開啓wss的方法,以及過程中遇到的一些問題(主要是我菜)
首先需要有證書,我用的是寶塔面板申請的免費證書,寶塔申請的免費證書路徑在/etc/letsencrypt/live/,會列出來所有申請了免費證書的網站,公司服務器就不放截圖了。一定要記住這個路徑,後面用得到。然後是swoole需要開啓openssl,我的是寶塔面板安裝的swoole好像默認是開啓的,查資料的時候發現有的不是默認開啓的需要重新安裝編譯,如果需要手動編譯安裝可以查看比如https://qq52o.me/2700.html,https://www.php.cn/swoole/437812.html還有https://www.cnblogs.com/hodge01/p/8658296.html,任君挑選
最後是websocket控制器,這裏是在下面這位大佬的代碼基礎上改的https://blog.csdn.net/msllws/article/details/84405127
注意!!!!以下代碼被我刪除了大量業務代碼,配置可以直接參考,業務邏輯需要自己完善。

<?php

namespace app\index\controller;


use think\Db;
use think\swoole\Server;

class WebsocketController extends Server
{
    protected $host = '0.0.0.0'; //監聽所有地址
    protected $port = 9501; //監聽9501端口
    protected $serverType = 'ssl';
    protected $mode = SWOOLE_PROCESS;
    protected $sockType = SWOOLE_SOCK_TCP | SWOOLE_SSL;
    protected $option = [
        'worker_num' => 4, //設置啓動的Worker進程數
        'daemonize' => false, //守護進程化(上線改爲true)
        'backlog' => 128, //Listen隊列長度
        'dispatch_mode' => 2, //固定模式,保證同一個連接發來的數據只會被同一個worker處理

        //心跳檢測:每60秒遍歷所有連接,強制關閉10分鐘內沒有向服務器發送任何數據的連接
        'heartbeat_check_interval' => 60,
        'heartbeat_idle_time' => 600,
        //配置SSL證書和密鑰路徑
        'ssl_cert_file' => "/etc/letsencrypt/live/xxx/fullchain.pem",
        'ssl_key_file'  => "/etc/letsencrypt/live/xxx/privkey.pem"
    ];

    //建立連接時回調函數
    public function onOpen($server, $req)
    {
        $fd = $req->fd;//客戶端標識
        $user_id = $req->get['user_id'];//客戶端傳遞的用戶id
        $arr = array('code' => 1, 'info' => '查詢成功');
        $server->push($fd, json_encode($arr));
        echo "用戶".$user_id."建立了連接,標識爲".$fd ."\n";
    }

    //接收數據時回調函數
    public function onMessage($server, $frame)
    {
        $fd = $frame->fd;
        $message = $frame->data;
        $arr = array('code' => 1, 'info' => '查詢成功', 'data' => $order);
         //查詢對應用戶的標識,推送給對應用戶,羣組聊天可以循環推
        $server->push($fd , json_encode($arr));
     }


    //連接關閉時回調函數
    public function onClose($server, $fd)
    {
        echo "標識{$fd}關閉了連接\n";
    }
}

然後在server.php裏面添加以下代碼

case 'ssl':
                $this->swoole = new Websocket($this->host, $this->port, $this->mode, $this->sockType);
                break;

在這裏插入圖片描述
然後開啓服務,最後說一下,我踩過的坑,啓動服務之後小程序可以正常連上,但是公衆號怎麼都連不上,報的一個錯是net::ERR_CERT_COMMON_NAME_INVALID,網上查到的方法基本 都是修改證書或者修改瀏覽器,但是公衆號上操作並不現實,一些漫不經意的說話將我疑惑解開,同事問了一句誒,你們怎麼沒用域名請求呢,域名請求,域名。。。。。。我一開始開發測試的時候一直都用的ip,配置了證書之後忘記了改成域名Σ( ° △ °|||)︴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章