workerman是什么?

Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序。支持HTTP,Websocket,SSL和其他自定义协议。支持libevent,HHVM,ReactPHP。八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​zhuanlan.zhihu.com

要求PHP 5.3或更高版本

兼容POSIX的操作系统(Linux,OSX,BSD)

用于PHP的POSIX和PCNTL扩展

安装

composer require workerman/workerman

基本用法

websocket服务器

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

// 创建一个Websocket服务器

$ws_worker = new Worker("websocket://0.0.0.0:2346");

$ws_worker->count = 4;

// 在新连接到来时发出

$ws_worker->onConnect = function($connection)

{

echo "New connection\n";

};

// 接收数据时发出

$ws_worker->onMessage = function($connection, $data)

{

// Send hello $data

$connection->send('hello ' . $data);

};

// 连接关闭时发出

$ws_worker->onClose = function($connection)

{

echo "Connection closed\n";

};

// 运行worker

Worker::runAll();

http服务器

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

// #### http worker ####

$http_worker = new Worker("http://0.0.0.0:2345");

$http_worker->count = 4;

// 接收数据时发出

$http_worker->onMessage = function($connection, $data)

{

//$_GET、$_POST、$_COOKIE、$_SESSION、$_SERVER、$_FILES都是可用的

var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES);

// 发送数据给客户端

$connection->send("hello world \n");

};

// 运行所有workers

Worker::runAll();

WebServer

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\WebServer;

use Workerman\Worker;

// WebServer

$web = new WebServer("http://0.0.0.0:80");

$web->count = 4;

$web->addRoot('www.your_domain.com', '/your/path/Web');

$web->addRoot('www.another_domain.com', '/another/path/Web');

Worker::runAll();

TCP服务器

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

// #### 创建socket并监听1234端口 ####

$tcp_worker = new Worker("tcp://0.0.0.0:1234");

$tcp_worker->count = 4;

//在新连接到来时发出

$tcp_worker->onConnect = function($connection)

{

echo "New Connection\n";

};

// 接收数据时发出

$tcp_worker->onMessage = function($connection, $data)

{

// 发送数据给客户端

$connection->send("hello $data \n");

};

// 在新连接到来时发出

$tcp_worker->onClose = function($connection)

{

echo "Connection closed\n";

};

Worker::runAll();

启用SSL

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

// SSL环境

$context = array(

'ssl' => array(

'local_cert' => '/your/path/of/server.pem',

'local_pk' => '/your/path/of/server.key',

'verify_peer' => false,

)

);

// 创建一个带有ssl的Websocket服务器。

$ws_worker = new Worker("websocket://0.0.0.0:2346", $context);

// 启用SSL。WebSocket+SSL意味着安全的WebSocket (wss://)。

//类似的Https方法等等。

$ws_worker->transport = 'ssl';

$ws_worker->onMessage = function($connection, $data)

{

// 发送hello $data

$connection->send('hello ' . $data);

};

Worker::runAll();

自定义协议

Protocols/MyTextProtocol.php

namespace Protocols;

/**

* 用户定义的协议

*格式文本+“\ n”

*/

class MyTextProtocol

{

public static function input($recv_buffer)

{

// 找到“\n”第一个出现的位置

$pos = strpos($recv_buffer, "\n");

// 不是一个完整的package。返回0,因为package的长度无法计算

if($pos === false)

{

return 0;

}

// 返回package的长度

return $pos+1;

}

public static function decode($recv_buffer)

{

return trim($recv_buffer);

}

public static function encode($data)

{

return $data."\n";

}

}

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

// #### MyTextProtocol worker ####

$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");

$text_worker->onConnect = function($connection)

{

echo "New connection\n";

};

$text_worker->onMessage = function($connection, $data)

{

// 发送数据给客户端

$connection->send("hello world \n");

};

$text_worker->onClose = function($connection)

{

echo "Connection closed\n";

};

// 运行所有workers

Worker::runAll();

计时器

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

use Workerman\Lib\Timer;

$task = new Worker();

$task->onWorkerStart = function($task)

{

// 2.5秒

$time_interval = 2.5;

$timer_id = Timer::add($time_interval,

function()

{

echo "Timer run\n";

}

);

};

//运行

Worker::runAll();

AsyncTcpConnection(tcp / ws / text / frame等...)

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();

$worker->onWorkerStart = function()

{

//客户端Websocket协议。

$ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80");

$ws_connection->onConnect = function($connection){

$connection->send('hello');

};

$ws_connection->onMessage = function($connection, $data){

echo "recv: $data\n";

};

$ws_connection->onError = function($connection, $code, $msg){

echo "error: $msg\n";

};

$ws_connection->onClose = function($connection){

echo "connection closed\n";

};

$ws_connection->connect();

};

Worker::runAll();

ReactPHP的异步Mysql

composer require react/mysql

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:6161');

$worker->onWorkerStart = function() {

global $mysql;

$loop = Worker::getEventLoop();

$mysql = new React\MySQL\Connection($loop, array(

'host' => '127.0.0.1',

'dbname' => 'dbname',

'user' => 'user',

'passwd' => 'passwd',

));

$mysql->on('error', function($e){

echo $e;

});

$mysql->connect(function ($e) {

if($e) {

echo $e;

} else {

echo "connect success\n";

}

});

};

$worker->onMessage = function($connection, $data) {

global $mysql;

$mysql->query('show databases' /*trim($data)*/, function ($command, $mysql) use ($connection) {

if ($command->hasError()) {

$error = $command->getError();

} else {

$results = $command->resultRows;

$fields = $command->resultFields;

$connection->send(json_encode($results));

}

});

};

Worker::runAll();

ReactPHP的Async Redis

composer require clue/redis-react

require_once __DIR__ . '/vendor/autoload.php';

use Clue\React\Redis\Factory;

use Clue\React\Redis\Client;

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:6161');

$worker->onWorkerStart = function() {

global $factory;

$loop = Worker::getEventLoop();

$factory = new Factory($loop);

};

$worker->onMessage = function($connection, $data) {

global $factory;

$factory->createClient('localhost:6379')->then(function (Client $client) use ($connection) {

$client->set('greeting', 'Hello world');

$client->append('greeting', '!');

$client->get('greeting')->then(function ($greeting) use ($connection){

// Hello world!

echo $greeting . PHP_EOL;

$connection->send($greeting);

});

$client->incr('invocation')->then(function ($n) use ($connection){

echo 'This is invocation #' . $n . PHP_EOL;

$connection->send($n);

});

});

};

Worker::runAll();

Aysnc dns的ReactPHP

composer require react/dns

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:6161');

$worker->onWorkerStart = function() {

global $dns;

// Get event-loop.

$loop = Worker::getEventLoop();

$factory = new React\Dns\Resolver\Factory();

$dns = $factory->create('8.8.8.8', $loop);

};

$worker->onMessage = function($connection, $host) {

global $dns;

$host = trim($host);

$dns->resolve($host)->then(function($ip) use($host, $connection) {

$connection->send("$host: $ip");

},function($e) use($host, $connection){

$connection->send("$host: {$e->getMessage()}");

});

};

Worker::runAll();

ReactPHP的Http客户端

composer require react/http-client

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:6161');

$worker->onMessage = function($connection, $host) {

$loop = Worker::getEventLoop();

$client = new \React\HttpClient\Client($loop);

$request = $client->request('GET', trim($host));

$request->on('error', function(Exception $e) use ($connection) {

$connection->send($e);

});

$request->on('response', function ($response) use ($connection) {

$response->on('data', function ($data) use ($connection) {

$connection->send($data);

});

});

$request->end();

};

Worker::runAll();

ReactPHP的ZMQ

composer require react/zmq

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('text://0.0.0.0:6161');

$worker->onWorkerStart = function() {

global $pull;

$loop = Worker::getEventLoop();

$context = new React\ZMQ\Context($loop);

$pull = $context->getSocket(ZMQ::SOCKET_PULL);

$pull->bind('tcp://127.0.0.1:5555');

$pull->on('error', function ($e) {

var_dump($e->getMessage());

});

$pull->on('message', function ($msg) {

echo "Received: $msg\n";

});

};

Worker::runAll();

react的STOMP

composer requirereact/stomp

require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Worker;

$worker = new Worker('text://0.0.0.0:6161');

$worker->onWorkerStart = function() {

global $client;

$loop = Worker::getEventLoop();

$factory = new React\Stomp\Factory($loop);

$client = $factory->createClient(array('vhost' => '/', 'login' => 'guest', 'passcode' => 'guest'));

$client

->connect()

->then(function ($client) use ($loop) {

$client->subscribe('/topic/foo', function ($frame) {

echo "Message received: {$frame->body}\n";

});

});

};

Worker::runAll();

可用命令

php start.php start

php start.php start -d

php start.php status [object Object]

php start.php connections

php start.php stop

php start.php restart

php start.php reload

基准

CPU: Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totally

Memory: 8G

OS: Ubuntu 14.04 LTS

Software: ab

PHP: 5.5.9

代码

use Workerman\Worker;

$worker = new Worker('tcp://0.0.0.0:1234');

$worker->count=3;

$worker->onMessage = function($connection, $data)

{

$connection->send("HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nServer: workerman\r\nContent-Length: 5\r\n\r\nhello");

};

Worker::runAll();

结果

ab -n1000000 -c100 -k http://127.0.0.1:1234/

This is ApacheBench, Version 2.3

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)

Completed 100000 requests

Completed 200000 requests

Completed 300000 requests

Completed 400000 requests

Completed 500000 requests

Completed 600000 requests

Completed 700000 requests

Completed 800000 requests

Completed 900000 requests

Completed 1000000 requests

Finished 1000000 requests

Server Software: workerman/3.1.4

Server Hostname: 127.0.0.1

Server Port: 1234

Document Path: /

Document Length: 5 bytes

Concurrency Level: 100

Time taken for tests: 7.240 seconds

Complete requests: 1000000

Failed requests: 0

Keep-Alive requests: 1000000

Total transferred: 73000000 bytes

HTML transferred: 5000000 bytes

Requests per second: 138124.14 [#/sec] (mean)

Time per request: 0.724 [ms] (mean)

Time per request: 0.007 [ms] (mean, across all concurrent requests)

Transfer rate: 9846.74 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.0 0 5

Processing: 0 1 0.2 1 9

Waiting: 0 1 0.2 1 9

Total: 0 1 0.2 1 9

Percentage of the requests served within a certain time (ms)

50% 1

66% 1

75% 1

80% 1

90% 1

95% 1

98% 1

99% 1

100% 9 (longest request)

以上就是workerman的基本用法(示例详解)的详细内容

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

更多知识点八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)​zhuanlan.zhihu.com

参考^内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出

php reactphp wss_workerman的基本用法(示例详解)相关推荐

  1. python 匿名函数示例_扣丁学堂Python3开发之匿名函数用法示例详解

    扣丁学堂Python3开发之匿名函数用法示例详解 2018-07-26 14:01:11 1324浏览 今天扣丁学堂Python培训给大家分享关于Python3匿名函数用法,结合实例形式分析了Pyth ...

  2. linux chown 使用实例,chown命令_Linux chown命令用法示例详解

    Linux chown命令用法介绍 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用户或者是用户ID,用户组 ...

  3. python中result的用法_Python中qutip用法示例详解

    前言 QuTip是用于模拟开放量子系统动力学的开源库.QuTip库依赖于的Numpy.Scipy和Cython的数值包.此外,matplotlib提供了图形输出.http://qutip.org/. ...

  4. c++头文件iomanip.h中setw()、setprecision()、setbase用法示例详解

    c++头文件iomanip.h中setw().setprecision().setbase #include <iostream>    //不要用iostream.h ,会出现好多问题 ...

  5. java list用法 包,java list用法示例详解

    |--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引, |-- ArrayList:底层的数据结构使用的是数组结构 ...

  6. python bisect_Python中bisect的用法及示例详解

    bisect是python内置模块,用于有序序列的插入和查找. 查找: bisect(array, item) 插入: insort(array,item) 查找 import bisect a = ...

  7. python的用途实例-python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件 ...

  8. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  9. mysql去重函数的使用方法_MySQL中使用去重distinct方法的示例详解

    一 distinct 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而 ...

最新文章

  1. 文本多标签分类python_Scikitlearn多标签分类
  2. 【线段树】二进制(luogu 4428)
  3. 查看、关闭SELinux
  4. 成为java架构师需要具备那些技能?
  5. 【论文解读】情感-原因关系挖掘 —— ACL2019杰出论文
  6. itexpdf同一个段落不同文字,如何设置不同的格式
  7. nfine mysql_全开源版NFine快速开发框架C#源码
  8. matlab大地坐标与经纬度转换,如何把经纬度转化为大地坐标
  9. 实时错误‘429’:ActiveX控件不能创建对象
  10. 纳什均衡C++简单实现
  11. 这家SaaS公司估值50亿美元,竟然没有一个销售人员
  12. Matlab 极坐标平面 插值,如何在极坐标中进行插值
  13. Jupyter Notebook 菜单栏选项全解说
  14. 华为OD机试真题 Python 实现【快递投放问题】【2023 Q1 | 100分】
  15. custom_filter
  16. 一个简单的使用支持向量机(SVM)进行回归预测的Python代码示例,包含了源数据和注释
  17. linux百度云工具baidu pcs
  18. DDR内存大小计算以及MIG核配置
  19. 哈佛学霸用Python分析相亲网站数据后,写了份完美约会经验贴
  20. coolq使用(一)

热门文章

  1. 手机腾讯视频android版插件,小程序1.6.5版更新,终于支持腾讯视频插件了
  2. 旧电脑怎么升级配置_旧电脑升级哪些配件效果最好?答案莫过于这3点!
  3. PHP中使用include、require、include_once、require_once的区别
  4. 拉勾网《32个Java面试必考点》学习笔记之二------操作系统与网络知识
  5. 循环训练_力量循环训练
  6. 手机号验证_国际手机号收不到微博验证短信,微博验证短信一直提示超过上限怎么办?...
  7. a卡显存检测软件_科普小课堂,A卡玩家如何轻松超频?
  8. ncvlog帮助文档存放路径_Cadence ncvlog error
  9. java构造方法可以重载吗_Java基础教程之构造器与方法重载
  10. java 父类转子类_Java多态,对象转型,和简单工厂模式。希望对您有帮助!