各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

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

管理员 2023-09-05
PHP
126

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

内容导读

收集整理的这篇技术教程文章主要介绍了workerman的基本用法(示例详解),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含10954字,纯文字阅读大概需要16分钟

内容图文

workerman是什么?

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

要求

PHP 5.3或更高版本兼容POSIX的操作系统(Linux,OSX,BSD)用于PHP的POSIX和PCNTL扩展

安装

composer require workerman/workerman

基本用法

websocket服务器

<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;// 创建一个Websocket服务器$ws_worker = new Worker("websocket://0.0.0.0:2346");$ws_worker->count = 4;// 在新连接到来时发出$ws_worker->onConnect = function($connection){    echo "New connectionn"; };// 接收数据时发出$ws_worker->onMessage = function($connection, $data){    // Send hello $data    $connection->send('hello ' . $data);};// 连接关闭时发出$ws_worker->onClose = function($connection){    echo "Connection closedn";};// 运行workerWorker::runAll();

http服务器

require_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;// #### 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 WorkermanWebServer;use WorkermanWorker;// 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 WorkermanWorker;// #### 创建socket并监听1234端口 ####$tcp_worker = new Worker("tcp://0.0.0.0:1234");$tcp_worker->count = 4;//在新连接到来时发出$tcp_worker->onConnect = function($connection){    echo "New Connectionn";};// 接收数据时发出$tcp_worker->onMessage = function($connection, $data){    // 发送数据给客户端    $connection->send("hello $data n");};// 在新连接到来时发出$tcp_worker->onClose = function($connection){    echo "Connection closedn";};Worker::runAll();

启用SSL

<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;// 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 WorkermanWorker;// #### MyTextProtocol worker ####$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");$text_worker->onConnect = function($connection){    echo "New connectionn";};$text_worker->onMessage =  function($connection, $data){    // 发送数据给客户端    $connection->send("hello world n");};$text_worker->onClose = function($connection){    echo "Connection closedn";};// 运行所有workersWorker::runAll();

计时器

require_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;use WorkermanLibTimer;$task = new Worker();$task->onWorkerStart = function($task){    // 2.5秒    $time_interval = 2.5;     $timer_id = Timer::add($time_interval,         function()        {            echo "Timer runn";        }    );};//运行Worker::runAll();

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

require_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;use WorkermanConnectionAsyncTcpConnection;$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: $datan";    };    $ws_connection->onError = function($connection, $code, $msg){        echo "error: $msgn";    };    $ws_connection->onClose = function($connection){        echo "connection closedn";    };    $ws_connection->connect();};Worker::runAll();

ReactPHP的异步Mysql

composer require react/mysql
<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onWorkerStart = function() {    global $mysql;    $loop  = Worker::getEventLoop();    $mysql = new ReactMySQLConnection($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 successn";        }    });};$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
<?phprequire_once __DIR__ . '/vendor/autoload.php';use ClueReactRedisFactory;use ClueReactRedisClient;use WorkermanWorker;$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 WorkermanWorker;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onWorkerStart = function() {    global   $dns;    // Get event-loop.    $loop    = Worker::getEventLoop();    $factory = new ReactDnsResolverFactory();    $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
<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onMessage = function($connection, $host) {    $loop    = Worker::getEventLoop();    $client  = new ReactHttpClientClient($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
<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;$worker = new Worker('text://0.0.0.0:6161');$worker->onWorkerStart = function() {    global   $pull;    $loop    = Worker::getEventLoop();    $context = new ReactZMQContext($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: $msgn";    });};Worker::runAll();

react的STOMP

composer require react/stomp
<?phprequire_once __DIR__ . '/vendor/autoload.php';use WorkermanWorker;$worker = new Worker('text://0.0.0.0:6161');$worker->onWorkerStart = function() {    global   $client;    $loop    = Worker::getEventLoop();    $factory = new ReactStompFactory($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 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

代码

<?phpuse WorkermanWorker;$worker = new Worker('tcp://0.0.0.0:1234');$worker->count=3;$worker->onMessage = function($connection, $data){    $connection->send("HTTP/1.1 200 OKrnConnection: keep-alivernServer: workermanrnContent-Length: 5rnrnhello");};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%      1  66%      1  75%      1  80%      1  90%      1  95%      1  98%      1  99%      1 100%      9 (longest request)

本篇文章就是关于workerman的相关介绍,希望对需要的朋友有所帮助!

以上就是workerman的基本用法(示例详解)的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的workerman的基本用法(示例详解)全部内容,希望文章能够帮你解决workerman的基本用法(示例详解)所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部