一早上,所有的错误代码都遇上了,老扎心了
配置环境
官网文档环境要求
按照说明文档,查询了下,
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日才发现官网文档是有说明的!