workermen+php 聊天室(一)

(一)、了解什么是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 用户点击这里

安装

下载后解压即可

示例

1、新建文件start.php


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();

2、启动服务器

php start.php start

1542017426283

客户端

使用 PHP 启动了 WebSocket 服务器之后,会在服务器上监听一个端口号(上面代码中的 8484)。有了服务器之后,我们就可以编写前端代码连接服务器进行数据通信。

客户端可以是任何一个支持 WebSocket 协议的软件,我们常用的就是浏览器。

在浏览器中编写代码自然是使用 JavaScript 语言了。

JS 中的 WebSocket

使用 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();

你可能感兴趣的:(workermen)