国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

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

2024-05-04 21:50:57
字體:
來源:轉載
供稿:網友

workerman是什么?

Workerman是一個異步事件驅動的PHP框架,具有高性能,可輕松構建快速,可擴展的網絡應用程序。支持HTTP,Websocket,SSL和其他自定義協議。支持libevent,HHVM,ReactPHP。

要求:

PHP 5.3或更高版本

兼容POSIX的操作系統(Linux,OSX,BSD)

用于PHP的POSIX和PCNTL擴展

安裝:

composer require workerman/workerman

基本用法:

websocket服務器

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6.  
  7.  
  8. // 創建一個Websocket服務器 
  9.  
  10. $ws_worker = new Worker("websocket://0.0.0.0:2346"); 
  11.  
  12.  
  13.  
  14. $ws_worker->count = 4; 
  15.  
  16.  
  17.  
  18. // 在新連接到來時發出 
  19.  
  20. $ws_worker->onConnect = function($connection
  21.  
  22.  
  23.     echo "New connection/n"
  24.  
  25.  }; 
  26.  
  27.  
  28.  
  29. // 接收數據時發出 
  30.  
  31. $ws_worker->onMessage = function($connection$data
  32.  
  33.  
  34.     // Send hello $data 
  35.  
  36.     $connection->send('hello ' . $data); 
  37.  
  38. }; 
  39.  
  40.  
  41.  
  42. // 連接關閉時發出 
  43.  
  44. $ws_worker->onClose = function($connection
  45.  
  46.  
  47.     echo "Connection closed/n"
  48.  
  49. }; 
  50.  
  51.  
  52. // 運行worker 
  53.  
  54. Worker::runAll(); 

http服務器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // #### http worker #### 
  8.  
  9. $http_worker = new Worker("http://0.0.0.0:2345"); 
  10.  
  11.  
  12.  
  13. $http_worker->count = 4; 
  14.  
  15.  
  16.  
  17. // 接收數據時發出 
  18.  
  19. $http_worker->onMessage = function($connection$data
  20.  
  21.  
  22.     //$_GET、$_POST、$_COOKIE、$_SESSION、$_SERVER、$_FILES都是可用的 
  23.  
  24.     var_dump($_GET$_POST$_COOKIE$_SESSION$_SERVER$_FILES); 
  25.  
  26.     // 發送數據給客戶端 
  27.  
  28.     $connection->send("hello world /n"); 
  29.  
  30. }; 
  31.  
  32. // 運行所有workers 
  33.  
  34. Worker::runAll(); 

WebServer

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/WebServer; 
  4.  
  5. use Workerman/Worker; 
  6.  
  7.  
  8.  
  9. // WebServer 
  10.  
  11. $web = new WebServer("http://0.0.0.0:80"); 
  12.  
  13.  
  14.  
  15. $web->count = 4; 
  16.  
  17.  
  18.  
  19. $web->addRoot('www.your_domain.com''/your/path/Web'); 
  20.  
  21. $web->addRoot('www.another_domain.com''/another/path/Web'); 
  22.  
  23.  
  24.  
  25. Worker::runAll(); 

TCP服務器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // #### 創建socket并監聽1234端口 #### 
  8.  
  9. $tcp_worker = new Worker("tcp://0.0.0.0:1234"); 
  10.  
  11.  
  12.  
  13. $tcp_worker->count = 4; 
  14.  
  15.  
  16.  
  17. //在新連接到來時發出 
  18.  
  19. $tcp_worker->onConnect = function($connection
  20.  
  21.  
  22.     echo "New Connection/n"
  23.  
  24. }; 
  25.  
  26.  
  27.  
  28. // 接收數據時發出 
  29.  
  30. $tcp_worker->onMessage = function($connection$data
  31.  
  32.  
  33.     // 發送數據給客戶端 
  34.  
  35.     $connection->send("hello $data /n"); 
  36.  
  37. }; 
  38.  
  39.  
  40.  
  41. // 在新連接到來時發出 
  42.  
  43. $tcp_worker->onClose = function($connection
  44.  
  45.  
  46.     echo "Connection closed/n"
  47.  
  48. }; 
  49.  
  50.  
  51.  
  52. Worker::runAll(); 

啟用SSL

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6. // SSL環境 
  7.  
  8. $context = array
  9.  
  10.     'ssl' => array
  11.  
  12.         'local_cert'  => '/your/path/of/server.pem'
  13.  
  14.         'local_pk'    => '/your/path/of/server.key'
  15.  
  16.         'verify_peer' => false, 
  17.  
  18.     ) 
  19.  
  20. ); 
  21.  
  22. // 創建一個帶有ssl的Websocket服務器。 
  23.  
  24. $ws_worker = new Worker("websocket://0.0.0.0:2346"$context); 
  25.   
  26. // 啟用SSL。WebSocket+SSL意味著安全的WebSocket (wss://)。 
  27.  
  28. //類似的Https方法等等。 
  29.  
  30. $ws_worker->transport = 'ssl'
  31.   
  32. $ws_worker->onMessage = function($connection$data
  33.  
  34.  
  35.     // 發送hello $data 
  36.  
  37.     $connection->send('hello ' . $data); 
  38.  
  39. }; 
  40.  
  41. Worker::runAll(); 

自定義協議

Protocols/MyTextProtocol.php

  1. namespace Protocols; 
  2.  
  3. /** 
  4.  
  5.  * 用戶定義的協議 
  6.  
  7. *格式文本+“/ n” 
  8.  
  9.  */ 
  10.  
  11. class MyTextProtocol 
  12.  
  13.  
  14.     public static function input($recv_buffer
  15.  
  16.     { 
  17.  
  18.         // 找到“/n”第一個出現的位置 
  19.  
  20.         $pos = strpos($recv_buffer"/n"); 
  21.  
  22.         // 不是一個完整的package。返回0,因為package的長度無法計算 
  23.  
  24.         if($pos === false) 
  25.  
  26.         { 
  27.  
  28.             return 0; 
  29.  
  30.         } 
  31.  
  32.         // 返回package的長度 
  33.  
  34.         return $pos+1; 
  35.  
  36.     } 
  37.  
  38.  
  39.  
  40.     public static function decode($recv_buffer
  41.  
  42.     { 
  43.  
  44.         return trim($recv_buffer); 
  45.  
  46.     } 
  47.  
  48.  
  49.  
  50.     public static function encode($data
  51.  
  52.     { 
  53.  
  54.         return $data."/n"
  55.  
  56.     } 
  57.  
  58.  
  59. require_once __DIR__ . '/vendor/autoload.php'
  60.  
  61. use Workerman/Worker; 
  62.  
  63. // #### MyTextProtocol worker #### 
  64.  
  65. $text_worker = new Worker("MyTextProtocol://0.0.0.0:5678"); 
  66.  
  67. $text_worker->onConnect = function($connection
  68.  
  69.  
  70.     echo "New connection/n"
  71.  
  72. }; 
  73.  
  74. $text_worker->onMessage =  function($connection$data
  75.  
  76.  
  77.     // 發送數據給客戶端 
  78.  
  79.     $connection->send("hello world /n"); 
  80.  
  81. }; 
  82.  
  83. $text_worker->onClose = function($connection
  84.  
  85.  
  86.     echo "Connection closed/n"
  87.  
  88. }; 
  89.  
  90. // 運行所有workers 
  91.  
  92. Worker::runAll(); 

計時器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. use Workerman/Lib/Timer; 
  6.  
  7.  
  8.  
  9. $task = new Worker(); 
  10.  
  11. $task->onWorkerStart = function($task
  12.  
  13.  
  14.     // 2.5秒 
  15.  
  16.     $time_interval = 2.5;  
  17.  
  18.     $timer_id = Timer::add($time_interval,  
  19.  
  20.         function() 
  21.  
  22.         { 
  23.  
  24.             echo "Timer run/n"
  25.  
  26.         } 
  27.  
  28.     ); 
  29.  
  30. }; 
  31.  
  32. //運行 
  33.  
  34. Worker::runAll(); 

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

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. use Workerman/Connection/AsyncTcpConnection; 
  6.  
  7.  
  8. $worker = new Worker(); 
  9.  
  10. $worker->onWorkerStart = function() 
  11.  
  12.  
  13.     //客戶端Websocket協議。 
  14.  
  15.     $ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80"); 
  16.  
  17.     $ws_connection->onConnect = function($connection){ 
  18.  
  19.         $connection->send('hello'); 
  20.  
  21.     }; 
  22.  
  23.     $ws_connection->onMessage = function($connection$data){ 
  24.  
  25.         echo "recv: $data/n"
  26.  
  27.     }; 
  28.  
  29.     $ws_connection->onError = function($connection$code$msg){ 
  30.  
  31.         echo "error: $msg/n"
  32.  
  33.     }; 
  34.  
  35.     $ws_connection->onClose = function($connection){ 
  36.  
  37.         echo "connection closed/n"
  38.  
  39.     }; 
  40.  
  41.     $ws_connection->connect(); 
  42.  
  43. }; 
  44.  
  45. Worker::runAll(); 

ReactPHP的異步Mysql

composer require react/mysql

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6.  
  7.  
  8. $worker = new Worker('tcp://0.0.0.0:6161'); 
  9.  
  10. $worker->onWorkerStart = function() { 
  11.  
  12.     global $mysql
  13.  
  14.     $loop  = Worker::getEventLoop(); 
  15.  
  16.     $mysql = new React/MySQL/Connection($looparray
  17.  
  18.         'host'   => '127.0.0.1'
  19.  
  20.         'dbname' => 'dbname'
  21.  
  22.         'user'   => 'user'
  23.  
  24.         'passwd' => 'passwd'
  25.  
  26.     )); 
  27.  
  28.     $mysql->on('error'function($e){ 
  29.  
  30.         echo $e
  31.  
  32.     }); 
  33.  
  34.     $mysql->connect(function ($e) { 
  35.  
  36.         if($e) { 
  37.  
  38.             echo $e
  39.  
  40.         } else { 
  41.  
  42.             echo "connect success/n"
  43.  
  44.         } 
  45.  
  46.     }); 
  47.  
  48. }; 
  49.  
  50. $worker->onMessage = function($connection$data) { 
  51.  
  52.     global $mysql
  53.  
  54.     $mysql->query('show databases' /*trim($data)*/function ($command$mysqluse ($connection) { 
  55.  
  56.         if ($command->hasError()) { 
  57.  
  58.             $error = $command->getError(); 
  59.  
  60.         } else { 
  61.  
  62.             $results = $command->resultRows; 
  63.  
  64.             $fields  = $command->resultFields; 
  65.  
  66.             $connection->send(json_encode($results)); 
  67.  
  68.         } 
  69.  
  70.     }); 
  71.  
  72. }; 
  73.  
  74. Worker::runAll(); 

ReactPHP的Async Redis

composer require clue/redis-react

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Clue/React/Redis/Factory; 
  5.  
  6. use Clue/React/Redis/Client; 
  7.  
  8. use Workerman/Worker; 
  9.  
  10.  
  11.  
  12. $worker = new Worker('tcp://0.0.0.0:6161'); 
  13.  
  14.  
  15.  
  16. $worker->onWorkerStart = function() { 
  17.  
  18.     global $factory
  19.  
  20.     $loop    = Worker::getEventLoop(); 
  21.  
  22.     $factory = new Factory($loop); 
  23.  
  24. }; 
  25.  
  26.  
  27.  
  28. $worker->onMessage = function($connection$data) { 
  29.  
  30.     global $factory
  31.  
  32.     $factory->createClient('localhost:6379')->then(function (Client $clientuse ($connection) { 
  33.  
  34.         $client->set('greeting''Hello world'); 
  35.  
  36.         $client->append('greeting''!'); 
  37.  
  38.  
  39.  
  40.         $client->get('greeting')->then(function ($greetinguse ($connection){ 
  41.  
  42.             // Hello world! 
  43.  
  44.             echo $greeting . PHP_EOL; 
  45.  
  46.             $connection->send($greeting); 
  47.  
  48.         }); 
  49.  
  50.  
  51.  
  52.         $client->incr('invocation')->then(function ($nuse ($connection){ 
  53.  
  54.             echo 'This is invocation #' . $n . PHP_EOL; 
  55.  
  56.             $connection->send($n); 
  57.  
  58.         }); 
  59.  
  60.     }); 
  61.  
  62. }; 
  63.  
  64. Worker::runAll(); 

Aysnc dns的ReactPHP

composer require react/dns

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. $worker = new Worker('tcp://0.0.0.0:6161'); 
  6.  
  7. $worker->onWorkerStart = function() { 
  8.  
  9.     global   $dns
  10.  
  11.     // Get event-loop. 
  12.  
  13.     $loop    = Worker::getEventLoop(); 
  14.  
  15.     $factory = new React/Dns/Resolver/Factory(); 
  16.  
  17.     $dns     = $factory->create('8.8.8.8'$loop); 
  18.  
  19. }; 
  20.  
  21. $worker->onMessage = function($connection$host) { 
  22.  
  23.     global $dns
  24.  
  25.     $host = trim($host); 
  26.  
  27.     $dns->resolve($host)->then(function($ipuse($host$connection) { 
  28.  
  29.         $connection->send("$host: $ip"); 
  30.  
  31.     },function($euse($host$connection){ 
  32.  
  33.         $connection->send("$host: {$e->getMessage()}"); 
  34.  
  35.     }); 
  36.  
  37. }; 
  38.  
  39.  
  40. Worker::runAll(); 

ReactPHP的Http客戶端

composer require react/http-client

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6.  
  7. $worker = new Worker('tcp://0.0.0.0:6161'); 
  8.  
  9.  
  10. $worker->onMessage = function($connection$host) { 
  11.  
  12.     $loop    = Worker::getEventLoop(); 
  13.  
  14.     $client  = new /React/HttpClient/Client($loop); 
  15.  
  16.     $request = $client->request('GET', trim($host)); 
  17.  
  18.     $request->on('error'function(Exception $euse ($connection) { 
  19.  
  20.         $connection->send($e); 
  21.  
  22.     }); 
  23.  
  24.     $request->on('response'function ($responseuse ($connection) { 
  25.  
  26.         $response->on('data'function ($datause ($connection) { 
  27.  
  28.             $connection->send($data); 
  29.  
  30.         }); 
  31.  
  32.     }); 
  33.  
  34.     $request->end(); 
  35.  
  36. }; 
  37.  
  38.  
  39. Worker::runAll(); 

ReactPHP的ZMQ

composer require react/zmq

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6. $worker = new Worker('text://0.0.0.0:6161'); 
  7.  
  8. $worker->onWorkerStart = function() { 
  9.  
  10.     global   $pull
  11.  
  12.     $loop    = Worker::getEventLoop(); 
  13.  
  14.     $context = new React/ZMQ/Context($loop); 
  15.  
  16.     $pull    = $context->getSocket(ZMQ::SOCKET_PULL); 
  17.  
  18.     $pull->bind('tcp://127.0.0.1:5555'); 
  19.  
  20.     $pull->on('error'function ($e) { 
  21.  
  22.         var_dump($e->getMessage()); 
  23.  
  24.     }); 
  25.  
  26.     $pull->on('message'function ($msg) { 
  27.  
  28.         echo "Received: $msg/n"
  29.  
  30.     }); 
  31.  
  32. }; 
  33.  
  34. Worker::runAll(); 

react的STOMP

composer require react/stomp

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6. $worker = new Worker('text://0.0.0.0:6161');  
  7.  
  8. $worker->onWorkerStart = function() { 
  9.  
  10.     global   $client
  11.  
  12.     $loop    = Worker::getEventLoop(); 
  13.  
  14.     $factory = new React/Stomp/Factory($loop); 
  15.  
  16.     $client  = $factory->createClient(array('vhost' => '/''login' => 'guest''passcode' => 'guest'));  
  17.  
  18.     $client 
  19.  
  20.         ->connect() 
  21.  
  22.         ->then(function ($clientuse ($loop) { 
  23.  
  24.             $client->subscribe('/topic/foo'function ($frame) { 
  25.  
  26.                 echo "Message received: {$frame->body}/n"
  27.  
  28.             }); 
  29.  
  30.         }); 
  31.  
  32. }; 
  33.  
  34.  
  35.  
  36. Worker::runAll(); 

可用命令

php start.php start

php start.php start -d

e98162e9c0fdc68f6806079d39791cf.png

php start.php status [object Object]

php start.php connections

php start.php stop

php start.php restart

php start.php reload

基準

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

代碼:

  1.  
  2. use Workerman/Worker; 
  3.  
  4. $worker = new Worker('tcp://0.0.0.0:1234'); 
  5.  
  6. $worker->count=3; 
  7.  
  8. $worker->onMessage = function($connection$data
  9.  
  10.  
  11.     $connection->send("HTTP/1.1 200 OK/r/nConnection: keep-alive/r/nServer: workerman/r/nContent-Length: 5/r/n/r/nhello"); 
  12.  
  13. }; 
  14.  
  15. Worker::runAll(); 

結果:

  1. ab -n1000000 -c100 -k http://127.0.0.1:1234/ 
  2.  
  3. This is ApacheBench, Version 2.3 <$Revision: 1528965 $> 
  4.  
  5. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  6.  
  7. Licensed to The Apache Software Foundation, http://www.apache.org/  
  8.  
  9. Benchmarking 127.0.0.1 (be patient) 
  10.  
  11. Completed 100000 requests 
  12.  
  13. Completed 200000 requests 
  14.  
  15. Completed 300000 requests 
  16.  
  17. Completed 400000 requests 
  18.  
  19. Completed 500000 requests 
  20.  
  21. Completed 600000 requests 
  22.  
  23. Completed 700000 requests 
  24.  
  25. Completed 800000 requests 
  26.  
  27. Completed 900000 requests 
  28.  
  29. Completed 1000000 requests 
  30.  
  31. Finished 1000000 requests   
  32.  
  33. Server Software:        workerman/3.1.4 
  34.  
  35. Server Hostname:        127.0.0.1 
  36.  
  37. Server Port:            1234 
  38.   
  39. Document Path:          / 
  40.  
  41. Document Length:        5 bytes  
  42.  
  43. Concurrency Level:      100 
  44.  
  45. Time taken for tests:   7.240 seconds 
  46.  
  47. Complete requests:      1000000 
  48.  
  49. Failed requests:        0 
  50.  
  51. Keep-Alive requests:    1000000 
  52.  
  53. Total transferred:      73000000 bytes 
  54.  
  55. HTML transferred:       5000000 bytes 
  56.  
  57. Requests per second:    138124.14 [#/sec] (mean) 
  58.  
  59. Time per request:       0.724 [ms] (mean) 
  60.  
  61. Time per request:       0.007 [ms] (mean, across all concurrent requests) 
  62.  
  63. Transfer rate:          9846.74 [Kbytes/sec] received 
  64.  
  65.  
  66. Connection Times (ms) 
  67.  
  68.               min  mean[+/-sd] median   max 
  69.  
  70. Connect:        0    0   0.0      0       5 
  71.  
  72. Processing:     0    1   0.2      1       9 
  73.  
  74. Waiting:        0    1   0.2      1       9 
  75.  
  76. Total:          0    1   0.2      1       9 
  77.   
  78. Percentage of the requests served within a certain time (ms) 
  79.  
  80.   50%      1 
  81.  
  82.   66%      1 
  83.  
  84.   75%      1 
  85.  
  86.   80%      1 
  87.  
  88.   90%      1 
  89.  
  90.   95%      1 
  91.  
  92.   98%      1 
  93.  
  94.   99%      1 
  95.  
  96.  100%      9 (longest request) 

本篇文章就是關于workerman的相關介紹,希望對需要的朋友有所幫助!workerman是什么?

Workerman是一個異步事件驅動的PHP框架,具有高性能,可輕松構建快速,可擴展的網絡應用程序。支持HTTP,Websocket,SSL和其他自定義協議。支持libevent,HHVM,ReactPHP。

要求:

PHP 5.3或更高版本

兼容POSIX的操作系統(Linux,OSX,BSD)

用于PHP的POSIX和PCNTL擴展

安裝:

composer require workerman/workerman

基本用法

websocket服務器

  1.  
  2. require_once __DIR__ . '/vendor/autoload.php'
  3.  
  4. use Workerman/Worker; 
  5.  
  6.  
  7. // 創建一個Websocket服務器 
  8.  
  9. $ws_worker = new Worker("websocket://0.0.0.0:2346"); 
  10.  
  11.  
  12. $ws_worker->count = 4; 
  13.  
  14.  
  15. // 在新連接到來時發出 
  16.  
  17. $ws_worker->onConnect = function($connection
  18.  
  19.  
  20.     echo "New connection/n"
  21.  
  22.  }; 
  23.  
  24.  
  25.  
  26. // 接收數據時發出 
  27.  
  28. $ws_worker->onMessage = function($connection$data
  29.  
  30.  
  31.     // Send hello $data 
  32.  
  33.     $connection->send('hello ' . $data); 
  34.  
  35. }; 
  36.  
  37.  
  38.  
  39. // 連接關閉時發出 
  40.  
  41. $ws_worker->onClose = function($connection
  42.  
  43.  
  44.     echo "Connection closed/n"
  45.  
  46. }; 
  47.  
  48.  
  49. // 運行worker 
  50.  
  51. Worker::runAll(); 

http服務器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // #### http worker #### 
  8.  
  9. $http_worker = new Worker("http://0.0.0.0:2345"); 
  10.  
  11.  
  12.  
  13. $http_worker->count = 4; 
  14.  
  15.  
  16.  
  17. // 接收數據時發出 
  18.  
  19. $http_worker->onMessage = function($connection$data
  20.  
  21.  
  22.     //$_GET、$_POST、$_COOKIE、$_SESSION、$_SERVER、$_FILES都是可用的 
  23.  
  24.     var_dump($_GET$_POST$_COOKIE$_SESSION$_SERVER$_FILES); 
  25.  
  26.     // 發送數據給客戶端 
  27.  
  28.     $connection->send("hello world /n"); 
  29.  
  30. }; 
  31.  
  32.  
  33. // 運行所有workers 
  34.  
  35. Worker::runAll(); 

WebServer

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/WebServer; 
  4.  
  5. use Workerman/Worker; 
  6.  
  7.  
  8.  
  9. // WebServer 
  10.  
  11. $web = new WebServer("http://0.0.0.0:80"); 
  12.  
  13.  
  14.  
  15. $web->count = 4; 
  16.  
  17.  
  18.  
  19. $web->addRoot('www.your_domain.com''/your/path/Web'); 
  20.  
  21. $web->addRoot('www.another_domain.com''/another/path/Web'); 
  22.  
  23.  
  24.  
  25. Worker::runAll(); 

TCP服務器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // #### 創建socket并監聽1234端口 #### 
  8.  
  9. $tcp_worker = new Worker("tcp://0.0.0.0:1234"); 
  10.  
  11.  
  12.  
  13. $tcp_worker->count = 4; 
  14.  
  15.  
  16.  
  17. //在新連接到來時發出 
  18.  
  19. $tcp_worker->onConnect = function($connection
  20.  
  21.  
  22.     echo "New Connection/n"
  23.  
  24. }; 
  25.  
  26.  
  27.  
  28. // 接收數據時發出 
  29.  
  30. $tcp_worker->onMessage = function($connection$data
  31.  
  32.  
  33.     // 發送數據給客戶端 
  34.  
  35.     $connection->send("hello $data /n"); 
  36.  
  37. }; 
  38.  
  39.  
  40.  
  41. // 在新連接到來時發出 
  42.  
  43. $tcp_worker->onClose = function($connection
  44.  
  45.  
  46.     echo "Connection closed/n"
  47.  
  48. }; 
  49.  
  50.  
  51.  
  52. Worker::runAll(); 

啟用SSL

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // SSL環境 
  8.  
  9. $context = array
  10.  
  11.     'ssl' => array
  12.  
  13.         'local_cert'  => '/your/path/of/server.pem'
  14.  
  15.         'local_pk'    => '/your/path/of/server.key'
  16.  
  17.         'verify_peer' => false, 
  18.  
  19.     ) 
  20.  
  21. ); 
  22.  
  23.  
  24.  
  25. // 創建一個帶有ssl的Websocket服務器。 
  26.  
  27. $ws_worker = new Worker("websocket://0.0.0.0:2346"$context); 
  28.  
  29.  
  30.  
  31. // 啟用SSL。WebSocket+SSL意味著安全的WebSocket (wss://)。 
  32.  
  33. //類似的Https方法等等。 
  34.  
  35. $ws_worker->transport = 'ssl'
  36.  
  37.  
  38.  
  39. $ws_worker->onMessage = function($connection$data
  40.  
  41.  
  42.     // 發送hello $data 
  43.  
  44.     $connection->send('hello ' . $data); 
  45.  
  46. }; 
  47.  
  48.  
  49.  
  50. Worker::runAll(); 

自定義協議

Protocols/MyTextProtocol.php

  1. namespace Protocols; 
  2.  
  3. /** 
  4.  
  5.  * 用戶定義的協議 
  6.  
  7. *格式文本+“/ n” 
  8.  
  9.  */ 
  10.  
  11. class MyTextProtocol 
  12.  
  13.  
  14.     public static function input($recv_buffer
  15.  
  16.     { 
  17.  
  18.         // 找到“/n”第一個出現的位置 
  19.  
  20.         $pos = strpos($recv_buffer"/n"); 
  21.  
  22.         // 不是一個完整的package。返回0,因為package的長度無法計算 
  23.  
  24.         if($pos === false) 
  25.  
  26.         { 
  27.  
  28.             return 0; 
  29.  
  30.         } 
  31.  
  32.         // 返回package的長度 
  33.  
  34.         return $pos+1; 
  35.  
  36.     } 
  37.  
  38.  
  39.  
  40.     public static function decode($recv_buffer
  41.  
  42.     { 
  43.  
  44.         return trim($recv_buffer); 
  45.  
  46.     } 
  47.  
  48.  
  49.  
  50.     public static function encode($data
  51.  
  52.     { 
  53.  
  54.         return $data."/n"
  55.  
  56.     } 
  57.  
  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. // #### MyTextProtocol worker #### 
  8.  
  9. $text_worker = new Worker("MyTextProtocol://0.0.0.0:5678"); 
  10.  
  11.  
  12.  
  13. $text_worker->onConnect = function($connection
  14.  
  15.  
  16.     echo "New connection/n"
  17.  
  18. }; 
  19.  
  20.  
  21.  
  22. $text_worker->onMessage =  function($connection$data
  23.  
  24.  
  25.     // 發送數據給客戶端 
  26.  
  27.     $connection->send("hello world /n"); 
  28.  
  29. }; 
  30.  
  31.  
  32.  
  33. $text_worker->onClose = function($connection
  34.  
  35.  
  36.     echo "Connection closed/n"
  37.  
  38. }; 
  39.  
  40.  
  41.  
  42. // 運行所有workers 
  43.  
  44. Worker::runAll(); 

計時器

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. use Workerman/Lib/Timer; 
  6.  
  7.  
  8.  
  9. $task = new Worker(); 
  10.  
  11. $task->onWorkerStart = function($task
  12.  
  13.  
  14.     // 2.5秒 
  15.  
  16.     $time_interval = 2.5;  
  17.  
  18.     $timer_id = Timer::add($time_interval,  
  19.  
  20.         function() 
  21.  
  22.         { 
  23.  
  24.             echo "Timer run/n"
  25.  
  26.         } 
  27.  
  28.     ); 
  29.  
  30. }; 
  31.  
  32.  
  33.  
  34. //運行 
  35.  
  36. Worker::runAll(); 

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

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. use Workerman/Connection/AsyncTcpConnection; 
  6.  
  7.  
  8.  
  9. $worker = new Worker(); 
  10.  
  11. $worker->onWorkerStart = function() 
  12.  
  13.  
  14.     //客戶端Websocket協議。 
  15.  
  16.     $ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80"); 
  17.  
  18.     $ws_connection->onConnect = function($connection){ 
  19.  
  20.         $connection->send('hello'); 
  21.  
  22.     }; 
  23.  
  24.     $ws_connection->onMessage = function($connection$data){ 
  25.  
  26.         echo "recv: $data/n"
  27.  
  28.     }; 
  29.  
  30.     $ws_connection->onError = function($connection$code$msg){ 
  31.  
  32.         echo "error: $msg/n"
  33.  
  34.     }; 
  35.  
  36.     $ws_connection->onClose = function($connection){ 
  37.  
  38.         echo "connection closed/n"
  39.  
  40.     }; 
  41.  
  42.     $ws_connection->connect(); 
  43.  
  44. }; 
  45.  
  46. Worker::runAll(); 

ReactPHP的異步Mysql

composer require react/mysql

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. $worker = new Worker('tcp://0.0.0.0:6161'); 
  8.  
  9. $worker->onWorkerStart = function() { 
  10.  
  11.     global $mysql
  12.  
  13.     $loop  = Worker::getEventLoop(); 
  14.  
  15.     $mysql = new React/MySQL/Connection($looparray
  16.  
  17.         'host'   => '127.0.0.1'
  18.  
  19.         'dbname' => 'dbname'
  20.  
  21.         'user'   => 'user'
  22.  
  23.         'passwd' => 'passwd'
  24.  
  25.     )); 
  26.  
  27.     $mysql->on('error'function($e){ 
  28.  
  29.         echo $e
  30.  
  31.     }); 
  32.  
  33.     $mysql->connect(function ($e) { 
  34.  
  35.         if($e) { 
  36.  
  37.             echo $e
  38.  
  39.         } else { 
  40.  
  41.             echo "connect success/n"
  42.  
  43.         } 
  44.  
  45.     }); 
  46.  
  47. }; 
  48.  
  49. $worker->onMessage = function($connection$data) { 
  50.  
  51.     global $mysql
  52.  
  53.     $mysql->query('show databases' /*trim($data)*/function ($command$mysqluse ($connection) { 
  54.  
  55.         if ($command->hasError()) { 
  56.  
  57.             $error = $command->getError(); 
  58.  
  59.         } else { 
  60.  
  61.             $results = $command->resultRows; 
  62.  
  63.             $fields  = $command->resultFields; 
  64.  
  65.             $connection->send(json_encode($results)); 
  66.  
  67.         } 
  68.  
  69.     }); 
  70.  
  71. }; 
  72.  
  73. Worker::runAll(); 

ReactPHP的Async Redis

composer require clue/redis-react

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Clue/React/Redis/Factory; 
  4.  
  5. use Clue/React/Redis/Client; 
  6.  
  7. use Workerman/Worker; 
  8.  
  9.  
  10.  
  11. $worker = new Worker('tcp://0.0.0.0:6161'); 
  12.  
  13.  
  14.  
  15. $worker->onWorkerStart = function() { 
  16.  
  17.     global $factory
  18.  
  19.     $loop    = Worker::getEventLoop(); 
  20.  
  21.     $factory = new Factory($loop); 
  22.  
  23. }; 
  24.  
  25.  
  26.  
  27. $worker->onMessage = function($connection$data) { 
  28.  
  29.     global $factory
  30.  
  31.     $factory->createClient('localhost:6379')->then(function (Client $clientuse ($connection) { 
  32.  
  33.         $client->set('greeting''Hello world'); 
  34.  
  35.         $client->append('greeting''!'); 
  36.  
  37.  
  38.  
  39.         $client->get('greeting')->then(function ($greetinguse ($connection){ 
  40.  
  41.             // Hello world! 
  42.  
  43.             echo $greeting . PHP_EOL; 
  44.  
  45.             $connection->send($greeting); 
  46.  
  47.         }); 
  48.  
  49.  
  50.  
  51.         $client->incr('invocation')->then(function ($nuse ($connection){ 
  52.  
  53.             echo 'This is invocation #' . $n . PHP_EOL; 
  54.  
  55.             $connection->send($n); 
  56.  
  57.         }); 
  58.  
  59.     }); 
  60.  
  61. }; 
  62.  
  63.  
  64.  
  65. Worker::runAll(); 

Aysnc dns的ReactPHP

composer require react/dns

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. $worker = new Worker('tcp://0.0.0.0:6161'); 
  6.  
  7. $worker->onWorkerStart = function() { 
  8.  
  9.     global   $dns
  10.  
  11.     // Get event-loop. 
  12.  
  13.     $loop    = Worker::getEventLoop(); 
  14.  
  15.     $factory = new React/Dns/Resolver/Factory(); 
  16.  
  17.     $dns     = $factory->create('8.8.8.8'$loop); 
  18.  
  19. }; 
  20.  
  21. $worker->onMessage = function($connection$host) { 
  22.  
  23.     global $dns
  24.  
  25.     $host = trim($host); 
  26.  
  27.     $dns->resolve($host)->then(function($ipuse($host$connection) { 
  28.  
  29.         $connection->send("$host: $ip"); 
  30.  
  31.     },function($euse($host$connection){ 
  32.  
  33.         $connection->send("$host: {$e->getMessage()}"); 
  34.  
  35.     }); 
  36.  
  37. }; 
  38.  
  39.  
  40.  
  41. Worker::runAll(); 

ReactPHP的Http客戶端

composer require react/http-client

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. $worker = new Worker('tcp://0.0.0.0:6161'); 
  8.  
  9.  
  10.  
  11. $worker->onMessage = function($connection$host) { 
  12.  
  13.     $loop    = Worker::getEventLoop(); 
  14.  
  15.     $client  = new /React/HttpClient/Client($loop); 
  16.  
  17.     $request = $client->request('GET', trim($host)); 
  18.  
  19.     $request->on('error'function(Exception $euse ($connection) { 
  20.  
  21.         $connection->send($e); 
  22.  
  23.     }); 
  24.  
  25.     $request->on('response'function ($responseuse ($connection) { 
  26.  
  27.         $response->on('data'function ($datause ($connection) { 
  28.  
  29.             $connection->send($data); 
  30.  
  31.         }); 
  32.  
  33.     }); 
  34.  
  35.     $request->end(); 
  36.  
  37. }; 
  38.  
  39.  
  40.  
  41. Worker::runAll(); 

ReactPHP的ZMQ

composer require react/zmq

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5. $worker = new Worker('text://0.0.0.0:6161'); 
  6.  
  7. $worker->onWorkerStart = function() { 
  8.  
  9.     global   $pull
  10.  
  11.     $loop    = Worker::getEventLoop(); 
  12.  
  13.     $context = new React/ZMQ/Context($loop); 
  14.  
  15.     $pull    = $context->getSocket(ZMQ::SOCKET_PULL); 
  16.  
  17.     $pull->bind('tcp://127.0.0.1:5555'); 
  18.  
  19.     $pull->on('error'function ($e) { 
  20.  
  21.         var_dump($e->getMessage()); 
  22.  
  23.     }); 
  24.  
  25.     $pull->on('message'function ($msg) { 
  26.  
  27.         echo "Received: $msg/n"
  28.  
  29.     }); 
  30.  
  31. }; 
  32.  
  33. Worker::runAll(); 

react的STOMP

composer require react/stomp

  1. require_once __DIR__ . '/vendor/autoload.php'
  2.  
  3. use Workerman/Worker; 
  4.  
  5.  
  6.  
  7. $worker = new Worker('text://0.0.0.0:6161'); 
  8.  
  9.  
  10.  
  11. $worker->onWorkerStart = function() { 
  12.  
  13.     global   $client
  14.  
  15.     $loop    = Worker::getEventLoop(); 
  16.  
  17.     $factory = new React/Stomp/Factory($loop); 
  18.  
  19.     $client  = $factory->createClient(array('vhost' => '/''login' => 'guest''passcode' => 'guest')); 
  20.  
  21.  
  22.  
  23.     $client 
  24.  
  25.         ->connect() 
  26.  
  27.         ->then(function ($clientuse ($loop) { 
  28.  
  29.             $client->subscribe('/topic/foo'function ($frame) { 
  30.  
  31.                 echo "Message received: {$frame->body}/n"
  32.  
  33.             }); 
  34.  
  35.         }); 
  36.  
  37. }; 
  38.  
  39.  
  40.  
  41. Worker::runAll(); 

可用命令

php start.php start

php start.php start -d

e98162e9c0fdc68f6806079d39791cf.png

php start.php status [object Object]

php start.php connections

php start.php stop

php start.php restart

php start.php reload

基準

  1. CPU:      Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totally 
  2.  
  3. Memory:   8G 
  4.  
  5. OS:       Ubuntu 14.04 LTS 
  6.  
  7. Software: ab 

PHP: 5.5.9

代碼:

  1. use Workerman/Worker; 
  2.  
  3. $worker = new Worker('tcp://0.0.0.0:1234'); 
  4.  
  5. $worker->count=3; 
  6.  
  7. $worker->onMessage = function($connection$data
  8.  
  9.  
  10.     $connection->send("HTTP/1.1 200 OK/r/nConnection: keep-alive/r/nServer: workerman/r/nContent-Length: 5/r/n/r/nhello"); 
  11.  
  12. }; 
  13.  
  14. Worker::runAll(); 

結果

  1. ab -n1000000 -c100 -k http://127.0.0.1:1234/ 
  2.  
  3. This is ApacheBench, Version 2.3 <$Revision: 1528965 $> 
  4.  
  5. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  6.  
  7. Licensed to The Apache Software Foundation, http://www.apache.org/ 
  8.  
  9.  
  10.  
  11. Benchmarking 127.0.0.1 (be patient) 
  12.  
  13. Completed 100000 requests 
  14.  
  15. Completed 200000 requests 
  16.  
  17. Completed 300000 requests 
  18.  
  19. Completed 400000 requests 
  20.  
  21. Completed 500000 requests 
  22.  
  23. Completed 600000 requests 
  24.  
  25. Completed 700000 requests 
  26.  
  27. Completed 800000 requests 
  28.  
  29. Completed 900000 requests 
  30.  
  31. Completed 1000000 requests 
  32.  
  33. Finished 1000000 requests 
  34.  
  35.  
  36.  
  37.  
  38.  
  39. Server Software:        workerman/3.1.4 
  40.  
  41. Server Hostname:        127.0.0.1 
  42.  
  43. Server Port:            1234 
  44.  
  45.  
  46.  
  47. Document Path:          / 
  48.  
  49. Document Length:        5 bytes 
  50.  
  51.  
  52.  
  53. Concurrency Level:      100 
  54.  
  55. Time taken for tests:   7.240 seconds 
  56.  
  57. Complete requests:      1000000 
  58.  
  59. Failed requests:        0 
  60.  
  61. Keep-Alive requests:    1000000 
  62.  
  63. Total transferred:      73000000 bytes 
  64.  
  65. HTML transferred:       5000000 bytes 
  66.  
  67. Requests per second:    138124.14 [#/sec] (mean) 
  68.  
  69. Time per request:       0.724 [ms] (mean) 
  70.  
  71. Time per request:       0.007 [ms] (mean, across all concurrent requests) 
  72.  
  73. Transfer rate:          9846.74 [Kbytes/sec] received 
  74.  
  75.  
  76.  
  77. Connection Times (ms) 
  78.  
  79.               min  mean[+/-sd] median   max 
  80.  
  81. Connect:        0    0   0.0      0       5 
  82.  
  83. Processing:     0    1   0.2      1       9 
  84.  
  85. Waiting:        0    1   0.2      1       9 
  86.  
  87. Total:          0    1   0.2      1       9 
  88.  
  89.  
  90.  
  91. Percentage of the requests served within a certain time (ms) 
  92.  
  93.   50%      1 
  94.  
  95.   66%      1 
  96.  
  97.   75%      1 
  98.  
  99.   80%      1 
  100.  
  101.   90%      1 
  102.  
  103.   95%      1 
  104.  
  105.   98%      1 
  106.  
  107.   99%      1 
  108.  
  109.  100%      9 (longest request) 

本篇文章就是關于workerman的相關介紹,希望對需要的朋友有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博兴县| 乐陵市| 华蓥市| 定南县| 嘉黎县| 顺义区| 江津市| 东台市| 四川省| 乌兰察布市| 容城县| 郯城县| 五指山市| 米脂县| 徐汇区| 怀仁县| 砀山县| 苏尼特左旗| 安陆市| 信阳市| 平泉县| 兴义市| 高邮市| 内乡县| 万山特区| 东安县| 银川市| 安溪县| 兴文县| 柳州市| 景宁| 广饶县| 益阳市| 遂平县| 濮阳县| 外汇| 新泰市| 雅安市| 平顶山市| 永济市| 屯昌县|