(一)、了解什么是morkerman https://www.workerman.net/
## workerman
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。
workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
支持HHVM
使用PHP开发
支持PHP多进程/多线程(多线程版本)
标准输入输出重定向
支持毫秒定时器
支持基于事件的异步编程
守护进程化
支持TCP/UDP
支持多端口监听
接口上支持各种应用层协议
支持libevent事件轮询库,支持高并发
支持服务平滑重启
支持PHP文件更新检测及自动加载
支持PHP长连接
支持以指定用户运行子进程
支持telnet远程控制
高性能
PHP>=5.3 非Win系统 详细安装教程点击这里
Windows 用户点击这里
下载后解压即可
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 创建一个Worker监听2346端口,使用websocket协议通讯
$ws_worker = new Worker("websocket://0.0.0.0:2346");
// 启动4个进程对外提供服务
$ws_worker->count = 4;
// 当收到客户端发来的数据后返回hello $data给客户端
$ws_worker->onMessage = function($connection, $data)
{
// 向客户端发送hello $data
$connection->send('hello ' . $data);
};
// 运行
Worker::runAll();
php start.php start
使用 PHP 启动了 WebSocket 服务器之后,会在服务器上监听一个端口号(上面代码中的 8484)。有了服务器之后,我们就可以编写前端代码连接服务器进行数据通信。
客户端可以是任何一个支持 WebSocket
协议的软件,我们常用的就是浏览器。
在浏览器中编写代码自然是使用 JavaScript
语言了。
使用 JavaScript 实现 WebSocket 非常的简单,只需要以下几步:
1、连接服务器
2、绑定回调函数接收、处理数据
3、调用 send 方法发送数据
JS 中提供了一个 WebSocket 类,可以通过 new 来连接服务器,连接时需要指定服务器的IP地址和端口号:
var ws = new WebSocket('ws://ip:端口号');
连接了服务器之后,我们需要绑定几个回调函数,来处理相应的事件:
onopen:当连接成功时触发。
onmessage:当收到消息时触发。
onclose:当与服务器断开连接时触发。
// 连接服务器成功时触发
ws.onopen = function() {
console.log("连接成功")
}
// 收到服务器消息时触发
ws.onmessage = function(e) {
console.log("收到服务端的消息:" + e.data)
}
// 与服务器断开连接时触发
ws.onclose = function(e) {
console.log("与服务器断开连接")
}
可以调用 send
方法向服务器发送数据,也可以调用 close
方法断开和服务器的连接:
ws.send('Hello Tom') // 向服务器发送数据
ws.close(); // 断开连接
例:index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
head>
<body>
<div id="app">
<ul>
<li v-for="(v,k) in messages">
xxx说:{{v}}
li>
ul>
<textarea v-model="content" id="" cols="30" rows="10">textarea>
<input type="button" @click="submit" value="提交">
div>
body>
html>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js">script>
<script>
new Vue({
el:'#app',
data:{
content:'',
ws:null,
messages:[] //保存接收的消息
},
// 当vue 创建就调用
created:function(){
this.ws = new WebSocket('ws://127.0.0.1:8484');// 连接服务器
this.ws.onopen =this.open
this.ws.onmessage = this.message
},
methods:{
submit:function(){
this.ws.send(this.content)
// 清空表
this.content=''
},
open:function(){
alert('连接成功');
},
message:function(e){
// 把接收的消息放到页面
this.messages.push(e.data)
}
}
})
script>
serve.php
use Workerman\Worker;
require_once __DIR__ . '/Workerman-master/Autoloader.php';
$worker = new Worker('websocket://0.0.0.0:8484');
// 进程
$worker->count = 1;
$worker->onConnect = function($connection){
//向这个客户端发送数据
$connection->send('你好');
};
// 接收消息
$worker->onMessage = function($connection, $data)
{
// 会自动调用\Workerman\Protocols\Websocket::encode打包成websocket协议数据后发送
// $connection->send("hello\n");
global $worker;
// 循环客户端发送消息
foreach($worker->connections as $c){
//var_dump($c->send($data));
$c->send($data);
}
};
// 运行worker
Worker::runAll();