zyuyou / workerman
High performance Socket server framework for network applications implemented in PHP using libevent
Installs: 17
Dependents: 0
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 2 274
Type:project
pkg:composer/zyuyou/workerman
Requires
- php: >=5.3
- ext-sockets: *
Suggests
- ext-libevent: Really it's a requirement for normal work.
This package is not auto-updated.
Last update: 2025-12-20 23:57:07 UTC
README
Documentation:https://github.com/walkor/workerman-manual
Home page:http://www.workerman.net
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 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"); //create 4 hello_worker processes $tcp_worker->count = 4; // when client send data to 1234 port $tcp_worker->onMessage = function($connection, $data) { // send data to client $connection->send("hello $data \n"); }; 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) { // send data to client $connection->send("hello world \n"); }; // run all workers Worker::runAll();
A websocket server
test.php
require_once './Workerman/Autoloader.php'; use Workerman\Worker // #### websocket worker #### $ws_worker = new Worker("websocket://0.0.0.0:5678"); $ws_worker->onMessage = function($connection, $data) { // send data to client $connection->send("hello world \n"); }; // run all workers 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->onMessage = function($connection, $data) { // 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; $web->addRoot('www.your_domain.com', __DIR__.'/Web'); // 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
php test.php status
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
<?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\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
tadpole
BrowserQuest
web vmstat
live-ascii-camera
Live demo camera page
Live demo receive page
Source code
live-camera
Live demo camera page
Live demo receive page
Source code
chat room
statistics
flappybird
jsonRpc
thriftRpc
web-msg-sender
Live demo send page
Live demo receive page
Source code
shadowsocks-php
queue
LICENSE
Workerman is released under the MIT license.