您的位置:首页 > 其它

workerman安装与配置

2020-09-07 11:15 573 查看
  • 先安装fastadmin框架,为了使用composer ,不使用也可以
  • 宝塔里,解除全部禁用函数
  • linux上检测环境 curl -Ss http://www.workerman.net/check.php | php
  • 安装 composer require workerman/workerman
  • 启动命令
    php start.php start
    php start.php start -d
    php start.php stop
    php start.php restart
  • 端口 9510推送 9511text
  • 在根目录编写服务端
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2020/9/8
* Time: 8:38
*/
use Workerman\Worker;
use Workerman\Lib\Timer;
use think\Db;
require_once __DIR__ . '/vendor/workerman/workerman/Autoloader.php';
class Yaoguisocket{
public $worker;
public function init(){
define('HEARTBEAT_TIME', 60);
// 实例化 Worker 类对象
$worker = new Worker('websocket://0.0.0.0:9510');
$arr_updateok=array();
// 设置进程数3
$worker->count = 4;
// 服务端进程启动后设置10秒定时器,定时遍历关3闭心跳超时1的66
$worker->onWorkerStart = function($worker) {
//创建内部协议
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker('text://0.0.0.0:9511');
$inner_text_worker->onMessage = function($connection, $datajson)
{
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$arrdata = json_decode($datajson, true);
$ret=self::push_all($arrdata['msg']);
// 返回推送结果
$connection->send($ret ? $arrdata['msg'].'ok' : 'fail');
};
// ## 执行监听 ##
$inner_text_worker->listen();
//创建心跳定时器
Timer::add(20, function()use($worker){
$time_now = time();
foreach($worker->connections as $connection) {
// lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 客户端已经下线
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
};
// 设置回调函数
// 绑定连接的回调函数,这个函数会在有客户端连接时调用
// 参数:TcpConnection 类的对象,代表每个客户端
$worker->onConnect = function( $connection ) {
// 向这个客户端发数据
$connection->send('欢迎您3~');
};
// 接收消息
$worker->onMessage = function($connection, $data) {
$connection->lastMessageTime = time();
//如果不是心跳就返回数据
if ($data=='heart'){
$connection->send('this heart');

}else{
$connection->send($data);
}
};
return $worker;
}
public function __construct()
{
$this->worker=self::init();
$this->worker->runAll();
}
public function push_all($msg){
foreach($this->worker->connections as $c)
{
$c->send($msg);
return true;
}
return false;
}
}
$ws=new Yaoguisocket();

在后端编写调用代码

public function pushall(){
// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:9511', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('msg'=>'update|1.2.1');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
}

在前端编写js代码

<!DOCTYPE html>
<html>
<head>
<title>HTML5</title>
<meta charset="utf-8" />
</head>
<body>
<h1>WebSocket示例</h1>
<button>打开连接</button>
<button>发送数据</button>
<button>关闭连接</button>
<p id="msg"></p>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
</script>
<script>
function getdate(){
var date=new Date();
var year=date.getFullYear();
var month=date.getMonth()+1;
var day=date.getDate();
var hh=date.getHours();
var mm=date.getMinutes();
var ss=date.getSeconds();
return year+"年"+month+"月"+day+"日"+hh+":"+mm+":"+ss;
}
$(function() {
var socket;
$("button:eq(0)").click(function () {
/* 连接 */
socket = new WebSocket("ws://124.156.135.71:9510");
/* 绑定事件 */
socket.onopen = function() {
$("#msg").html("连接成功...");
setInterval(function () {
socket.send('heart')
}, 10000)
};
socket.onmessage = function(e) {
$("#msg").html($("#msg").html() + "<br />收到数据:" + e.data+'     '+getdate());
};
socket.onclose = function() {
$("#msg").html($("#msg").html() + "<br />关闭连接..."+'     '+getdate());
};
});
/* 发送数据事件 */
$("button:eq(1)").click(function() {
socket.send("hsfsdfdfsf9i");
});
/* 断开连接 */
$("button:eq(2)").click(function() {
socket.close();
});
});
</script>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: