在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
WorkermanWhat is itWorkerman is an asynchronous event driven PHP framework with high performance for easily building fast, scalable network applications. Supports HTTP, Websocket, SSL and other custom protocols. Supports libevent, HHVM , ReactPHP. RequiresPHP 5.3 or Higher Installationcomposer require workerman/workerman Basic UsageA websocket server<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// Create a Websocket server$ws_worker = new Worker("websocket://0.0.0.0:2346");// 4 processes$ws_worker->count = 4;// Emitted when new connection come$ws_worker->onConnect = function($connection){ echo "New connection\n"; };// Emitted when data received$ws_worker->onMessage = function($connection, $data){ // Send hello $data $connection->send('hello ' . $data);};// Emitted when connection closed$ws_worker->onClose = function($connection){ echo "Connection closed\n";};// Run workerWorker::runAll(); An http serverrequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// #### http worker ####$http_worker = new Worker("http://0.0.0.0:2345");// 4 processes$http_worker->count = 4;// Emitted when data received$http_worker->onMessage = function($connection, $data){ // $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES are available var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES); // send data to client $connection->send("hello world \n");};// run all workersWorker::runAll(); A WebServerrequire_once __DIR__ . '/vendor/autoload.php';use Workerman\WebServer;use Workerman\Worker;// WebServer$web = new WebServer("http://0.0.0.0:80");// 4 processes$web->count = 4;// Set the root of domains$web->addRoot('www.your_domain.com', '/your/path/Web');$web->addRoot('www.another_domain.com', '/another/path/Web');// run all workersWorker::runAll(); A tcp serverrequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// #### create socket and listen 1234 port ####$tcp_worker = new Worker("tcp://0.0.0.0:1234");// 4 processes$tcp_worker->count = 4;// Emitted when new connection come$tcp_worker->onConnect = function($connection){ echo "New Connection\n";};// Emitted when data received$tcp_worker->onMessage = function($connection, $data){ // send data to client $connection->send("hello $data \n");};// Emitted when new connection come$tcp_worker->onClose = function($connection){ echo "Connection closed\n";};Worker::runAll(); Enable SSL<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// SSL context.$context = array( 'ssl' => array( 'local_cert' => '/your/path/of/server.pem', 'local_pk' => '/your/path/of/server.key', 'verify_peer' => false, ));// Create a Websocket server with ssl context.$ws_worker = new Worker("websocket://0.0.0.0:2346", $context);// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). // The similar approaches for Https etc.$ws_worker->transport = 'ssl';$ws_worker->onMessage = function($connection, $data){ // Send hello $data $connection->send('hello ' . $data);};Worker::runAll(); Custom protocolProtocols/MyTextProtocol.php namespace Protocols;/** * User defined protocol * Format Text+"\n" */class MyTextProtocol{ public static function input($recv_buffer) { // Find the position of the first occurrence of "\n" $pos = strpos($recv_buffer, "\n"); // Not a complete package. Return 0 because the length of package can not be calculated if($pos === false) { return 0; } // Return length of the 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){ // send data to client $connection->send("hello world \n");};$text_worker->onClose = function($connection){ echo "Connection closed\n";};// run all workersWorker::runAll(); Timerrequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;use Workerman\Lib\Timer;$task = new Worker();$task->onWorkerStart = function($task){ // 2.5 seconds $time_interval = 2.5; $timer_id = Timer::add($time_interval, function() { echo "Timer run\n"; } );};// run all workersWorker::runAll(); AsyncTcpConnection (tcp/ws/text/frame etc...)require_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;use Workerman\Connection\AsyncTcpConnection;$worker = new Worker();$worker->onWorkerStart = function(){ // Websocket protocol for client. $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(); Async Mysql of ReactPHPcomposer 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(); Async Redis of ReactPHPcomposer 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 of ReactPHPcomposer 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(); Http client of ReactPHPcomposer 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(); ZMQ of ReactPHPcomposer 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(); STOMP of ReactPHPcomposer 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(); Available commands
Documentation中文文档: http://doc.workerman.net Documentation:https://github.com/walkor/workerman-manual BenchmarksCPU: Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totallyMemory: 8GOS: Ubuntu 14.04 LTSSoftware: abPHP: 5.5.9 Codes 全部评论
专题导读
上一篇:ServiceStack: A simple, fast, versatile and highly-productive full-featured Web ...发布时间:2022-02-13下一篇:vert.x: Vert.x is a tool-kit for building reactive applications on the JVM发布时间:2022-02-13热门推荐
热门话题
阅读排行榜
|
请发表评论