日韩性视频-久久久蜜桃-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的基本用法的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日日操夜夜爱 | 欧美性激情 | 欧美韩一区二区 | 久99热 | 探花国产精品一区二区 | 日毛片| 一级一级黄色片 | 久久精品成人一区二区三区蜜臀 | 羞羞涩涩网站 | 久久久一区二区 | 久久亚洲一区 | 欧美成人福利视频 | 国产青青草 | 亚洲成人基地 | 日本泡妞xxxx免费视频软件 | 亚洲性视频在线 | 在线免费观看视频a | 日韩淫片| 成人免费毛片片v | 91精品国产一区二区三区 | 国产精品18| 免费a级片视频 | 色哟哟精品一区 | 干综合网 | 欧美高清另类 | 最新国产中文字幕 | 国产激情视频一区二区 | 欧美操穴视频 | 亚洲片国产一区一级在线观看 | 久久亚洲精品小早川怜子 | 伊人网址| 国产精品日韩一区二区 | av小片| 一级黄色片在线 | 天天婷婷 | 久久久久无码国产精品不卡 | 国产黄色精品 | 久久精品在线播放 | www.成人精品 | 国偷自产av一区二区三区麻豆 | 激情插插 | 丝袜综合网 | 日日摸日日干 | 欧美熟妇精品一区二区蜜桃视频 | 日日骑夜夜操 | 精品久久久久久久久久久 | 久久精品在线播放 | 爱爱一区 | 欧美色综合 | 岛国精品 | 1000部国产精品成人观看 | 黑人干亚洲女 | 成人漫画网站 | 国产网红女主播精品视频 | 亚洲色图国产 | 成年人黄色免费网站 | 久久久免费高清视频 | 青青射| 免费一级肉体全黄毛片 | 国产精品主播 | 亚洲人毛茸茸 | 欧美影视一区二区三区 | xxxxx黄色片 噜噜噜噜噜色 | 51国产在线| 亚洲欧美自拍视频 | 欧美在线aa | 欧美xxx视频 | 成人手机在线播放 | 女人被狂躁c到高潮 | 欧美精品 在线观看 | 97精品人妻麻豆一区二区 | 贝利弗山的秘密1985版免费观看 | 亚洲自拍电影 | 亚洲激情视频网 | 越南av| 亚洲国产精品一区二区尤物区 | 国产一区视频免费观看 | 蜜桃传媒一区二区亚洲 | 蜜臀av中文字幕 | 青青艹av | 欧美精品亚洲精品日韩精品 | 亚洲网站在线播放 | 台湾佬av| 日韩无码电影 | 日韩色综合网 | 宅男噜噜噜 | 人人上人人干 | 日本三级小视频 | 奇米亚洲 | 国产精品 色 | 中文字幕无码毛片免费看 | 久久久人体| 国产精品美女在线 | 亚洲最大在线视频 | 青青国产 | 久久久久久国产免费a片 | 国模叶桐尿喷337p人体 | 亚洲爱v | 国产白丝一区二区三区 |