一早上,所有的錯誤代碼都遇上了,老扎心了
配置環境
官網文檔環境要求
按照說明文檔,查詢了下,
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日才發現官網文檔是有說明的!