workerman是什么?
workerman是一个异步事件驱动的php框架,具有高性能,可轻松构建快速,可扩展的网络应用程序。支持http,websocket,ssl和其他自定义协议。支持libevent,hhvm,reactphp。
推荐:《workerman教程》
要求
php 5.3或更高版本兼容posix的操作系统(linux,osx,bsd)用于php的posix和pcntl扩展
安装
composer require workerman/workerman
基本用法
websocket服务器
<?phprequire_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
<?phprequire_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
<?phprequire_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
<?phprequire_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
<?phprequire_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
<?phprequire_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 require react/stomp
<?phprequire_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 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 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% 1 66% 1 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 9 (longest request)
本篇文章就是关于workerman的相关介绍,希望对需要的朋友有所帮助!
以上就是workerman的基本用法(示例详解)的详细内容。