ThinkPHP与Workman的通信,以及错误解决[2020.7.16]
1.前提准备
基本错误,如Cannot assign requested address
,或者是websocket.html:11 WebSocket connection to 'ws://***:2346/' failed: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT
- 开启服务器平台安全组策略的端口,放行端口,一定要去服务器平台,比如腾讯云或者阿里云等
- 如果安装了宝塔,一定要在“安全”里放行端口
- 千万别关闭防火墙!仅放行端口就行!别看网上说关闭防火墙,不一定会有效果!并且服务器处于暴露状态
- 如果使用的是服务端使用域名监听,请改成IP监听一下试试,这个可以解决大部分问题
- 请提前配置好composer
- 请提前确认好ThinkPHP版本 > 5.0
- 请提前搭建好LAMP/LNMP,检查信息
curl -Ss http://www.workerman.net/check.php | php
,3样绿色OK缺一不可,如果有failed,请赶紧解决,参考地址,如果是宝塔,那将会很快捷,直接安装扩展,并且删除屏蔽监听函数。 - 不要频繁断开连接重复连接客户端,容易造成进程堵塞
2.推荐参数
- 服务端建议设置0.0.0.0,这样就不限制IP访问,不仅是内网还是公网,都是可以访问,不受限制
- 端口推荐80-90,这是TCP推荐端口,腾讯云安全组策略不支持自定义协议,建议更改区间去80-90,85设置为佳
- 服务端可以 尝试使用IP先进行测试,绝大多数是因为解析不到域名,先使用IP部署,如果没问题再更改域名
- 如果安装里宝塔控制面板,请放行80-90监听端口
Demo案例(ThinkPHP配合workerman)
安装ThinkPHP
该步骤省略,随意去TP官网还是Composer,都可以
安装workerman
使用composer安装,路径切换到composer.json目录下使用composer require workerman/workerman
命令
在application中创建一个服务进程
这个路径应该懂得如何创建文件吧?这个文件作用是用于创建进程和启动服务
<?php
namespace app\socket\controller;
use Workerman\Worker;
class Index
{
public function index()
{
//创建一个Worker监听85端口,使用websocket协议通讯
$ws_worker = new Worker("websocket://0.0.0.0:85");
// 启动4个进程对外提供服务
$ws_worker->count = 4;
// 当收到客户端发来的数据后返回hello $data给客户端
$ws_worker->onMessage = function($connection, $data)
{
// 向客户端发送hello $data
$connection->send('hello ' . $data);
};
// 运行worker
Worker::runAll();
}
}
开启workerman服务
去到public入口路径下,创建服务,我以server.php为例
<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
//绑定到socket所在模块
define('BIND_MODULE', 'socket/index/index'); //上方的进程地址
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
开启workerman服务
进入到服务器,输入命令:php server.php start
创建客户端连接
前往chrome浏览器,在控制台创建命令
<script type="text/javascript">
// 将IP改为你服务器的IP
ws = new WebSocket("ws://IP:85");
ws.onopen = function() {
console.log("连接成功");
ws.send('tom');
console.log("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
console.log("收到服务端的消息:" + e.data);
};
</script>
=做到此部分,你的基本就顺利=