轻松学会Workerman实战

初识Workerman

此课程是收费课程,请先购买或加入会员后再访问。

workerman是一款纯php开发的开源高性能的socket服务框架。它的性能强劲,学习简单,上手速度快。
主要用在即时通讯物联网游戏服务开发上。

基础概念

正式学习之前,需要了解的是两个基础概念。

短连接

短连接是指通讯双方有数据交互时,就建立一个连接。数据发送完成后,就断开这个连接,就是每次连接只完成一项业务的发送。像网站正常的http请求一般都用短连接

长连接

长连接,指在一个连接上可以连续发送多个数据包。
当需要主动向客户端推送数据时,例如聊天、即时游戏、手机推送,这些应当使用长连接

下载

下面来看一个几个非常简单的例子,先把Workerman框架下载下来。我把它下载到之前建好的项目文件夹中,你应该改成你自己的路径,当然你丢在桌面跑也是可以的。

Linux和Mac OS用户,下载地址 http://www.workerman.net/download/workermanzip
Windows用户,下载地址 http://www.workerman.net/download/workermanwinzip

使用HTTP协议提供Web服务

在项目根目录中,新建一个http_test.php文件

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2345端口,使用http协议通讯
$http_worker = new Worker("http://0.0.0.0:2345");

// 启动4个进程对外提供服务
$http_worker->count = 4;

// 接收到浏览器发送的数据时回复hello world给浏览器
$http_worker->onMessage = function($connection, $data) {
    // 向浏览器发送hello world
    $connection->send('hello world');
};

// 运行worker
Worker::runAll();

通过cd命令,先进入自己的项目路径,然后启动服务。

php http_test.php start

Tips: 用windows的同学注意,如果你的项目在D盘或者其他盘符,那你需要先在命令行打D:来切换磁盘,再cd进入项目路径。

访问 http://127.0.0.1:2345/,屏幕上就会显示出来hello world,这样其实就用workerman实现了原来apache或者nginx提供的http服务功能了。

使用TCP传输数据

再来试试,直接使用TCP协议来传输数据,在项目根目录中,新建一个tcp_test.php文件
http://doc.workerman.net/315113

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 创建一个Worker监听2347端口,不使用任何应用层协议
$tcp_worker = new Worker("tcp://0.0.0.0:2347");

// 启动4个进程对外提供服务
$tcp_worker->count = 4;

// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $data)
{
    // 向客户端发送hello $data
    $connection->send('hello ' . $data);
};

// 运行worker
Worker::runAll();

启动服务

php tcp_test.php start

开启一个新命令行窗口

telnet 127.0.0.1 2347

Tips: 退出使用ctrl + ],再按ctrl + c

使用WebSocket协议提供服务

以前做聊天室,有一种很常见的做法。就是在js中,用setInterval,定时不断的做ajax请求,看看有没有新发布的信息。如果有,那就append到聊天列表中。这种做法我们叫做轮询

这种轮询做法有非常严重的性能问题了,就是无论后端后没有新的数据,前端都在不停的请求。造成服务器出现非常高的并发量。

后来有了html 5,他里面有一个新功能,这就是websocket。与之前前端不停请求服务器流程不同的是,前端不去请求服务器上的数据。而是当服务器上有了数据变化,主动推送给前端。这样性能问题就得到了解决。

好,现在就来试试websocket,在项目根目录中,新建一个ws_test.php文件,代码和之前的几乎一模一样,只有一个地方不同,就是使用的协议是websocket

<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';

// 注意:这里与上个例子不通,使用的是websocket协议
$ws_worker = new Worker("websocket://0.0.0.0:2000");

// 启动4个进程对外提供服务
$ws_worker->count = 4;

// 当收到客户端发来的数据后返回 数据给客户端
$ws_worker->onMessage = function($connection, $data) {
    // 向客户端发送 你的名字叫: $data
    $connection->send('你的名字叫:' . $data);
};

// 运行worker
Worker::runAll();

启动服务

php ws_test.php start

再到根目录,新建一个websocket.html

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

<form action="">
    <input type="text" id="name" placeholder="请输入你的名字">
    <input type="submit" id="submit">
</form>

<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
    $(function () {
        var ws = new WebSocket("ws://127.0.0.1:2000");

        $("#submit").click(function () {
            var name = $("#name").val();
            ws.send(name);
            return false;
        })

        //收到服务器发送的信息时触发
        ws.onmessage = function (e) {
            alert(e.data);
        };
    })
</script>
</body>
</html>
方法 意义
new WebSocket 连接WebSocket
send 发送信息到服务端
onmessage 收到服务端发送的信息时

现在就注册ITFun.tv会员
持续关注IT界最新技术,随时更新相关课程。在线学习IT课程或直接报名参加线下武汉PHP、Web前端培训。

仅仅30秒钟就可以简单注册

会员注册(免费)
×