workerman+ssl+tp5服務端

一早上,所有的錯誤代碼都遇上了,老扎心了

配置環境

官網文檔環境要求
按照說明文檔,查詢了下,

curl -Ss http://www.workerman.net/check.php | php

發現少了個posix擴展,老習慣,有問題,百度下(原諒我是隻不稱職程序猿,懶得爬樹翻牆了)
網上一大堆yum install php-process,文章抄文章,還寫原創的,好吧,千千萬萬的同種坑。
正確姿勢:
1、查詢php版本 php -version
在這裏插入圖片描述
然後就根據查詢到的版本查找:yum search php70w(70就是你的版本號)
在這裏插入圖片描述
安裝對應包:yum install php70w-process.x86_64
當然,這也不一定能解決問題,不過起碼對於其他的直接yum install php-process安裝穩當,因爲默認安裝的話,是php5x的版本

服務端配置

接下來的服務端配置,依然是一臉懵逼(畢竟之前沒接觸過workerman),同樣,找教程tp5集成workerman,我服務端用的是tp5框架,文章還是搜索引擎前面的文章。
大概說就是,先安裝think-worker,要composer安裝,npm安裝之類的,但是,打開tp5的composer.json可以看到
在這裏插入圖片描述
已經默認裝配了,然後是要寫一個controller配置,這個控制器繼承think\worker\Server(這是think-worker的封裝了)只要配置屬性$socket就可以了,然後在項目根目錄下創建一個啓動文件start.php,將剛纔寫的控制器define到入口define('BIND_MODULE','namespace/controller');
發佈,運行php start.php start ( -d 加不加就是守護與非守護進程區別),這時,你會發現,workerman運行成功了。
但是,這時ws的配置(當然也可以配置http)
我要的wss呢?

開啓ssl

openssl的安裝、證書的申請配置這裏就不說了。
今天經歷了各種錯誤,按我記得的順序整理下:

  • 超時,可能是端口沒開啓(我用的是雲服務器,我打開對應端口就可以了)
  • net::ERR_SSL_PROTOCOL_ERROR,ssl問題,網上找了下,各種解決方法,看的比較雜亂,不過也大概理解了:
    可能是worker啓動姿勢有問題,打開我們的控制器,它繼承了Server,追蹤它
abstract class Server
{
    protected $worker;
    protected $socket    = '';
    protected $protocol  = 'http';
    protected $host      = '0.0.0.0';
    protected $port      = '2346';
    protected $processes = 4;

    /**
     * 架構函數
     * @access public
     */
    public function __construct()
    {
        // 實例化 Websocket 服務
        $this->worker = new Worker($this->socket ?: $this->protocol . '://' . $this->host . ':' . $this->port);
       
        // 設置進程數
        $this->worker->count = $this->processes;
        // 初始化
        $this->init();

        // 設置回調
        foreach (['onWorkerStart', 'onConnect', 'onMessage', 'onClose', 'onError', 'onBufferFull', 'onBufferDrain', 'onWorkerStop', 'onWorkerReload'] as $event) {
            if (method_exists($this, $event)) {
                $this->worker->$event = [$this, $event];
            }
        }
        // Run worker
        Worker::runAll();
    }

    protected function init()
    {
    }
}

可以看到,worker對象創建過程,但是並沒有配置ssl,那麼只要在構建worker對象時,開啓ssl就可以了

$context = array(
            'ssl'   =>  array(
            //這裏要用絕對路徑
                'local_cert'    =>  'crt/pem',
                'local_pk'      =>  'key',
                'verify_peer'   =>  false
            )
        );
$this->worker = new Worker($this->socket ?: $this->protocol . '://' . $this->host . ':' . $this->port,$context);
...
protected function init()
 {
     $this->worker->transport = 'ssl';
 }

字段不懂可以看php官方文檔:SSL 上下文選項

emmmm,寫着寫着有點失憶了,遇到的問題有一些忘了,不過解決流程整體是完整的,中間調試過程中走了不少彎路,整個過程大概也就是這樣了,開始覺得挺麻煩的,實際上倒也是不難。。

3.5日才發現官網文檔是有說明的!

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