日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

workerman的基本用法

發布時間:2023/11/28 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 workerman的基本用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

workerman是什么?

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

要求

1

2

3

PHP 5.3或更高版本

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

用于PHP的POSIX和PCNTL擴展

安裝

1

composer require workerman/workerman

基本用法

websocket服務器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<?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服務器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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

1

2

3

4

5

6

7

8

9

10

11

12

13

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服務器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

自定義協議

Protocols/MyTextProtocol.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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";

????}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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

計時器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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等...)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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

1

composer require react/mysql

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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

ReactPHP的Async Redis

1

composer require clue/redis-react

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<?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

1

composer require react/dns

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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客戶端

1

composer require react/http-client

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?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的ZMQ

1

composer require react/zmq

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<?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

1

composer require react/stomp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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

可用命令

1

2

php start.php start

php start.php start -d

1

php start.php status [object Object]

1

2

3

4

php start.php connections

php start.php stop

php start.php restart

php start.php reload

基準

1

2

3

4

5

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

3

4

5

6

7

8

9

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

結果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

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)

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

總結

以上是生活随笔為你收集整理的workerman的基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。