ArbeiterWas ist das?
Workerman ist ein asynchrones, ereignisgesteuertes PHP-Framework mit hoher Leistung, das die Erstellung schneller, skalierbarer Webanwendungen erleichtert. Unterstützt HTTP, Websocket, SSL und andere benutzerdefinierte Protokolle. Unterstützen Sie libevent, HHVM, ReactPHP.
Empfohlen: „Workerman-Tutorial“
Anforderungen
PHP 5.3或更高版本 兼容POSIX的操作系统(Linux,OSX,BSD) 用于PHP的POSIX和PCNTL扩展
Installation
composer require workerman/workerman
Grundlegende Nutzung
Websocket-Server
<?php 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"; }; // 运行worker Worker::runAll();
http-Server
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"); }; // 运行所有workers Worker::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-Server
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 aktivieren
<?php 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();
Benutzerdefiniertes Protokoll
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"; }; // 运行所有workers Worker::runAll();
Timer
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 etc...)
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();
Async Mysql für ReactPHP
composer require react/mysql
<?php 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();
Async für ReactPHP Redis
composer require clue/redis-react
<?php 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();
Http-Client für ReactPHP
composer require react/http-client
<?php 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
composer require react/zmq
<?php 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 require react/stomp
<?php 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();
Verfügbare Befehle
php start.php start php start.php start -d
php start.php status [object Object]
php start.php connections php start.php stop php start.php restart php start.php reload
Benchmark
CPU: Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totally Memory: 8G OS: Ubuntu 14.04 LTS Software: ab PHP: 5.5.9
Code
<?php 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();
Ergebnisse
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 requests Completed 200000 requests Completed 300000 requests Completed 400000 requests Completed 500000 requests Completed 600000 requests Completed 700000 requests Completed 800000 requests Completed 900000 requests Completed 1000000 requests Finished 1000000 requests Server Software: workerman/3.1.4 Server Hostname: 127.0.0.1 Server Port: 1234 Document Path: / Document Length: 5 bytes Concurrency Level: 100 Time taken for tests: 7.240 seconds Complete requests: 1000000 Failed requests: 0 Keep-Alive requests: 1000000 Total transferred: 73000000 bytes HTML transferred: 5000000 bytes Requests 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] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 5 Processing: 0 1 0.2 1 9 Waiting: 0 1 0.2 1 9 Total: 0 1 0.2 1 9 Percentage 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)
Dieser Artikel In diesem Artikel geht es um die Einführung von Arbeiter Ich hoffe, es wird Freunden in Not helfen!
Das obige ist der detaillierte Inhalt vonGrundlegende Verwendung von Workerman (detaillierte Beispiele). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!