Skip to content

An asynchronous event driven PHP framework for easily building fast, scalable network applications. Supports HTTP, Websocket and other custom protocols. Supports libevent, HHVM.

License

Notifications You must be signed in to change notification settings

Seven2/Workerman

Repository files navigation

Workerman

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.

Requires

PHP 5.3 or Higher
A POSIX compatible operating system (Linux, OSX, BSD)
POSIX and PCNTL extensions for PHP

Installation

composer require workerman/workerman 

Basic Usage

A websocket server

test.php

<?phpuseWorkerman\Worker; require_once'./Workerman/Autoloader.php'; // Create a Websocket server$ws_worker = newWorker("websocket://0.0.0.0:2346"); // 4 processes$ws_worker->count = 4; // Emitted when new connection come$ws_worker->onConnect = 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();

An http server

test.php

require_once'./Workerman/Autoloader.php'; useWorkerman\Worker; // #### http worker ####$http_worker = newWorker("http://0.0.0.0:2345"); // 4 processes$http_worker->count = 4; // Emitted when data received$http_worker->onMessage = function($connection, $data){// $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES are availablevar_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 = newWebServer("http://0.0.0.0:80"); // 4 processes$web->count = 4; // Set the root of domains$web->addRoot('www.your_domain.com', '/your/path/Web'); $web->addRoot('www.another_domain.com', '/another/path/Web'); // run all workers Worker::runAll();

A tcp server

test.php

require_once'./Workerman/Autoloader.php'; useWorkerman\Worker; // #### create socket and listen 1234 port ####$tcp_worker = newWorker("tcp://0.0.0.0:1234"); // 4 processes$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 = function($connection){echo"Connection closed\n"}; Worker::runAll();

Custom protocol

Protocols/MyTextProtocol.php

namespaceProtocols; /** * User defined protocol * Format Text+"\n" */class MyTextProtocol{publicstaticfunctioninput($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 calculatedif($pos === false){return0} // Return length of the packagereturn$pos+1} publicstaticfunctiondecode($recv_buffer){returntrim($recv_buffer)} publicstaticfunctionencode($data){return$data."\n"} }

test.php

require_once'./Workerman/Autoloader.php'; useWorkerman\Worker// #### MyTextProtocol worker ####$text_worker = newWorker("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'; useWorkerman\Worker; useWorkerman\Lib\Timer; $task = newWorker(); $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 with:

php test.php start

Available commands

php test.php start
php test.php start -d
workerman start
php test.php status
workerman satusphp test.php stop
php test.php restart
php test.php reload

Documentation

中文主页:http://www.workerman.net

中文文档: http://doc3.workerman.net

Documentation:https://github.com/walkor/workerman-manual

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

<?phpuseWorkerman\Worker; $worker = newWorker('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 <$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) 

Demos

Live demo
Source code
workerman todpole

Live demo
Source code
BrowserQuest width workerman

Live demo
Source code
web vmstat

Live demo camera page
Live demo receive page
Source code
live-ascii-camera

Live demo camera page
Live demo receive page
Source code
live-camera

Live demo
Source code
workerman-chat

Live demo
Source code
phpsocket.io

Live demo
Source code
workerman-statistics

Live demo
Source code
workerman-statistics

Source code
workerman-jsonRpc

Source code
workerman-thriftRpc

Live demo send page
Live demo receive page
Source code
web-msg-sender

Source code
shadowsocks-php

Source code

LICENSE

Workerman is released under the MIT license.

About

An asynchronous event driven PHP framework for easily building fast, scalable network applications. Supports HTTP, Websocket and other custom protocols. Supports libevent, HHVM.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • PHP100.0%