workerman的基本用法(示例详解)

2023-10-10 09:15

本文主要是介绍workerman的基本用法(示例详解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

workerman是什么?

Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序。支持HTTP,Websocket,SSL和其他自定义协议。支持libevent,HHVM,ReactPHP。

要求

  • 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";};// 运行workerWorker::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");};// 运行所有workersWorker::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";};// 运行所有workersWorker::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

2f960202310071039557166.png

php start.php status [object Object]

php start.php connectionsphp start.php stop php start.php restart php start.php reload 

基准

CPU:      Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totallyMemory:   8GOS:       Ubuntu 14.04 LTSSoftware: abPHP:      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 <$Revision: 1528965 $>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 requestsCompleted 200000 requestsCompleted 300000 requestsCompleted 400000 requestsCompleted 500000 requestsCompleted 600000 requestsCompleted 700000 requestsCompleted 800000 requestsCompleted 900000 requestsCompleted 1000000 requestsFinished 1000000 requestsServer Software:        workerman/3.1.4Server Hostname:        127.0.0.1Server Port:            1234Document Path:          /Document Length:        5 bytesConcurrency Level:      100Time taken for tests:   7.240 secondsComplete requests:      1000000Failed requests:        0Keep-Alive requests:    1000000Total transferred:      73000000 bytesHTML transferred:       5000000 bytesRequests 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] receivedConnection Times (ms)min  mean[+/-sd] median   maxConnect:        0    0   0.0      0       5Processing:     0    1   0.2      1       9Waiting:        0    1   0.2      1       9Total:          0    1   0.2      1       9Percentage of the requests served within a certain time (ms)50%      166%      175%      180%      190%      195%      198%      199%      1100%      9 (longest request)

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

这篇关于workerman的基本用法(示例详解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179501

相关文章

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放