• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

workerman: Workerman is an asynchronous event driven PHP framework with high per ...

原作者: [db:作者] 来自: 网络 收藏 邀请

Workerman

GitterLatest Stable VersionTotal DownloadsMonthly DownloadsDaily DownloadsLicense

What is it

Workerman 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.

Requires

PHP 5.3 or Higher
A POSIX compatible operating system (Linux, OSX, BSD)
POSIX and PCNTL extensions for PHP

Installation

composer require workerman/workerman

Basic Usage

A 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 server

require_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 WebServer

require_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 server

require_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 protocol

Protocols/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();

Timer

require_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 ReactPHP

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();

Async Redis of ReactPHP

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 of 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();

Http client of ReactPHP

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();

ZMQ of ReactPHP

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();

STOMP of ReactPHP

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();

Available commands

php start.php start
php start.php start -d
workerman start
php start.php status
workerman satus
php start.php connections
php start.php stop
php start.php restart
php start.php reload

Documentation

中文主页:http://www.workerman.net

中文文档: http://doc.workerman.net

Documentation:https://github.com/walkor/workerman-manual

Benchmarks

CPU:      Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totallyMemory:   8GOS:       Ubuntu 14.04 LTSSoftware: abPHP:      5.5.9

Codes


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap