前言:今天不错,workerman文档扫了一遍,现在开始扫GatewayWorker,以下是网址,这篇文章是我的文档阅读笔记。
http://doc2.workerman.net/
扫了一遍没什么收获,有个疑问是默认为什么给开了三个进程,而且三个进程的协议都不一样,比如text,我并不需要这个协议。回来再研究一下吧,困了。
发现GatewayWorker开了三个进程, 我估计我端口不够用,重新开一个。端口不能大于65535,
docker run -itd -p 60001:60001 -p 60002:60002 -p 60003:60003 -p 60004:60004 -p 60005:60005 -v /Users/guanliyang/php:/usr/share/nginx/html --name socken-php7.4 77cd7cd803b2
一口气开了5个端口,够我霍霍的了。进入容器安装一个pcntl
docker-php-ext-install pcntl
也不用重启,测试下环境ok
curl -Ss [http://www.workerman.net/check.php](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.workerman.net%2Fcheck.php) | php
ps命令常常用到,安装一下
apt-get update #慢死了
apt-get install -y procps #安装ps命令 慢
apt-get install net-tools #安装下ifconfig命令
由于mac ping 容器的 172.17.0.2 不同, ip写这个地址还是会报错。
Error in v-on handler: "InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECT
前端new socket并不报错,发送信息报错,ping不同,信息发送不出去。老老实实改了我映射的端口60001
我几乎什么都没做,start_gateway.php 里面稍微改下。
<?php
/**
* This file is part of workerman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use \Workerman\Worker;
use \Workerman\WebServer;
use \GatewayWorker\Gateway;
use \GatewayWorker\BusinessWorker;
use \Workerman\Autoloader;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
// gateway 进程,这里使用Text协议,可以用telnet测试
//$gateway = new Gateway("tcp://0.0.0.0:8282");
$gateway = new Gateway("websocket://0.0.0.0:60002");
// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数
//$gateway->count = 4;
$gateway->count = 1;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';
// 心跳间隔
//$gateway->pingInterval = 10;
// 心跳数据
//$gateway->pingData = '{"type":"ping"}';
/*
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
// 可以在这里判断连接来源是否合法,不合法就关掉连接
// $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
{
$connection->close();
}
// onWebSocketConnect 里面$_GET $_SERVER是可用的
// var_dump($_GET, $_SERVER);
};
};
*/
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
端口改下,进程改成1.
html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script src="js/vue.js"></script>
<body>
<div id="app">
<li v-for="message in get_message">
{{ message }}
</li>
</ol>
<input type="text" v-model="send_message">
<input type="button" @click="log" value="发送"/>
</div>
<script>
new Vue({
el: '#app',
data () {
return {
send_message: '',
get_message : [],
socket:"",
path:"ws://127.0.0.1:60002",
}
},
mounted () {
// 初始化
this.init()
},
methods: {
init: function () {
if(typeof(WebSocket) === "undefined"){
alert("您的浏览器不支持socket")
}else{
// 实例化socket
this.socket = new WebSocket(this.path)
// 监听socket连接
this.socket.onopen = this.open
// 监听socket错误信息
this.socket.onerror = this.error
// 监听socket消息
this.socket.onmessage = this.getMessage
}
},
log:function(event) {
this.socket.send(this.send_message);
},
getMessage: function (msg) {
//this.get_message = msg.data
this.get_message.push(msg.data)
},
}
});
</script>
</body>
</html>
还是上次的代码,发现走的就是event.php里面的东西。
也就是说聊天的话,直接编写event就可以了。
网友评论