php高性能http服务器,GitHub - bearinchina/Workerman: 一个高性能多进程 PHP socket 服务器框架,支持libevent,支持hhvm,支持websocke...

Workerman 3.0

What is it

Workerman is a library for event-driven programming in PHP. It has a huge number of features. Each worker is able to handle thousands of connections.

Usage

A websocket server

test.php

use Workerman\Worker;

require_once './Workerman/Autoloader.php';

// 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)

{

// Emitted when websocket handshake done

$connection->onWebSocketConnect = 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 worker

Worker::runAll();

A http server

test.php

require_once './Workerman/Autoloader.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 are available

var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES);

// send data to client

$connection->send("hello world \n");

};

// run all workers

Worker::runAll();

A WebServer

test.php

require_once './Workerman/Autoloader.php';

use \Workerman\WebServer;

// WebServer

$web = new WebServer("http://0.0.0.0:8686");

$web->count = 2;

// Set the root of domain

$web->addRoot('www.your_domain.com', '/your/path/Web');

// run all workers

Worker::runAll();

A tcp server

test.php

require_once './Workerman/Autoloader.php';

use Workerman\Worker;

// #### create socket and listen 1234 port ####

$tcp_worker = new Worker("tcp://0.0.0.0:1234");

$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($connection)

{

echo "Connection closed\n";

};

Worker::runAll();

User defined protocol

Protocols/MyTextProtocol.php

/**

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

}

}

test.php

require_once './Workerman/Autoloader.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 workers

Worker::runAll();

Timer

test.php

require_once './Workerman/Autoloader.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 workers

Worker::runAll();

run width

php test.php start

Available commands

php test.php start

php test.php start -d

b5617e49f0c46327f9ff9e0345e65b70.png

php test.php status

361e2c0350d50471893aa988aac8e8cd.png

php test.php stop

php test.php restart

php test.php reload

Benchmarks

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

Codes

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\1.1.4\r\n\r\nhello");

};

Worker::runAll();

Result

ab -n1000000 -c100 -k http://127.0.0.1:1234/

This is ApacheBench, Version 2.3

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)

Demos

LICENSE

Workerman is released under the MIT license.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值