wokerman介绍

Workerman是一款纯PHP开发的开源高性能的PHP 应用容器。

Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。

Workerman的一些应用方向如下:

1、即时通讯类
例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等
[示例 workerman-chat聊天室web消息推送小蝌蚪聊天室]

2、物联网类
例如Workerman与打印机通讯、与单片机通讯、智能手环、智能家居、共享单车等等。
[客户案例如 易联云、易泊时代等]

3、游戏服务器类
例如棋牌游戏、MMORPG游戏等等。[示例 browserquest-php]

4、HTTP服务
例如 写高性能HTTP接口、高性能网站。如果想要做HTTP相关的服务或者站点强烈推荐 webman

5、SOA服务化
利用Workerman将现有业务不同功能单元封装起来,以服务的形式对外提供统一的接口,达到系统松耦合、易维护、高可用、易伸缩。[示例 workerman-json-rpcworkerman-thrift]

6、其它服务器软件
例如 GatewayWorkerPHPSocket.IOhttp代理sock5代理分布式通讯组件分布式变量共享组件消息队列、DNS服务器、WebServer、CDN服务器、FTP服务器等等

7、组件
例如异步redis异步http客户端物联网mqtt客户端,消息队列 workerman/redis-queueworkerman/stompworkerman/rabbitmq文件监控组件,还有很多第三方开发的组件框架等等

显然传统的mvc框架很难实现以上的功能,所以也就是workerman诞生的原因。

安装workerman(macOS)

WorkerMan实际上就是一个PHP代码包,如果你的PHP环境已经装好,只需要把WorkerMan源代码或者demo下载下来即可运行。

composer require workerman/workerman

下载的workerman文件结构,记得放在一个文件夹下,作为项目使用

image-20221022194507059

开发实例

实例一、使用HTTP协议对外提供Web服务

我们使用编辑器打开workerman项目目录

创建http_test.php文件

image-20221022195024664

// http_test.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.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(TcpConnection $connection, Request $request)
{
    // 向浏览器发送hello world
    $connection->send('hello world');
};

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

我们在终端中进入Workerman目录

执行启动命令

php http_test.php start

在浏览器访问 127.0.0.1:2345 即可看到hello world

实例二、使用WebSocket协议对外提供服务

创建ws_test.php文件

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

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

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

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

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

创建websocket.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="">
    <input type="text" id="name" placeholder="请输入你的名字">
    <input type="submit" id="submit">
</form>

</body>
<script src="//lib.sinaapp.com/js/jquery/3.1.0/jquery-3.1.0.slim.min.js"></script>
<script>
    $(function () {
        let ws = new WebSocket("ws://127.0.0.1:2000")

        $("#submit").click(function () {
            let name = $('#name').val()
            ws.send(name)
            // return false是防止submit提交后刷新页面
            return false
        })
        ws.onmessage = function (e) {
            alert(e.data)
        }
    })
</script>
</html>

运行

php ws_test.php start

浏览器打开websocket.html,发送你输入的值,你就可以收到服务端返回的数据

实例三、直接使用TCP传输数据

创建tcp_test.php

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

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

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

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

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

命令行运行

php tcp_test.php start

测试:命令行运行(新开个终端窗口)
(以下是mac命令行效果,与windows下效果有所不同)

终端中输入

telnet 127.0.0.1 2347

image-20221022200639335

输入 world

haoran>~ $ telnet 127.0.0.1 2347
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
world
hello world

就能收到服务端返回的数据

注意:如果提示command not found: telnet,需要安装telnet,命令如下:

brew install telnet

退出telnet

control + ]后输入quit

原文地址:http://www.cnblogs.com/codehaoran/p/16817231.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性