• Stars
    star
    10,863
  • Rank 2,923 (Top 0.06 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 10 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

An asynchronous event driven PHP socket framework. Supports HTTP, Websocket, SSL and other custom protocols.

Workerman

Gitter Latest Stable Version Total Downloads Monthly Downloads Daily Downloads License

What is it

Workerman is an asynchronous event-driven PHP framework with high performance to build fast and scalable network applications. Workerman supports HTTP, Websocket, SSL and other custom protocols. Workerman supports event extension.

Requires

A POSIX compatible operating system (Linux, OSX, BSD)
POSIX and PCNTL extensions required
Event extension recommended for better performance

Installation

composer require workerman/workerman

Documentation

https://manual.workerman.net

Basic Usage

A websocket server

<?php

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

// Create a Websocket server
$ws_worker = new Worker('websocket://0.0.0.0:2346');

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

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

// #### http worker ####
$http_worker = new Worker('http://0.0.0.0:2345');

// 4 processes
$http_worker->count = 4;

// Emitted when data received
$http_worker->onMessage = function ($connection, $request) {
    //$request->get();
    //$request->post();
    //$request->header();
    //$request->cookie();
    //$request->session();
    //$request->uri();
    //$request->path();
    //$request->method();

    // Send data to client
    $connection->send("Hello World");
};

// Run all workers
Worker::runAll();

A tcp server

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

// #### create socket and listen 1234 port ####
$tcp_worker = new Worker('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 connection is closed
$tcp_worker->onClose = function ($connection) {
    echo "Connection closed\n";
};

Worker::runAll();

Enable SSL

<?php

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

// SSL context.
$context = [
    'ssl' => [
        'local_cert'  => '/your/path/of/server.pem',
        'local_pk'    => '/your/path/of/server.key',
        'verify_peer' => false,
    ]
];

// Create a Websocket server with ssl context.
$ws_worker = new Worker('websocket://0.0.0.0:2346', $context);

// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). 
// The similar approaches for Https etc.
$ws_worker->transport = 'ssl';

$ws_worker->onMessage = function ($connection, $data) {
    // Send hello $data
    $connection->send('Hello ' . $data);
};

Worker::runAll();

Custom protocol

Protocols/MyTextProtocol.php

namespace Protocols;

/**
 * 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";
    }
}
use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

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

use Workerman\Worker;
use Workerman\Timer;

require_once __DIR__ . '/vendor/autoload.php';

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

AsyncTcpConnection (tcp/ws/text/frame etc...)

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->onWorkerStart = function () {
    // Websocket protocol for client.
    $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();

Use HTTP proxy

<?php

require __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\AsyncTcpConnection;
$worker = new \Workerman\Worker();
$worker->onWorkerStart = function($worker){
    echo '开始链接' . PHP_EOL;
    $url = 'ws://stream.binance.com:9443/ws';
    $con = new AsyncTcpConnection($url);
    $con->transport = 'ssl';
//    $con->proxySocks5 = '127.0.0.1:1080';
    $con->proxyHttp = '127.0.0.1:25378';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $ww = [
            'id' => 1,
            'method' => 'SUBSCRIBE',
            'params' => [
                "btcusdt@aggTrade",
                "btcusdt@depth"
            ]
        ];
        echo '链接成功';
        $con->send(json_encode($ww));
        echo 'ok';
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->onClose = function (AsyncTcpConnection $con) {
        echo 'onClose' . PHP_EOL;
    };

    $con->onError = function (AsyncTcpConnection $con, $code, $msg) {
        echo "error [ $code ] $msg\n";
    };

    $con->connect();
};
\Workerman\Worker::runAll();

Use Socks5 proxy

<?php

require __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\AsyncTcpConnection;
$worker = new \Workerman\Worker();
$worker->onWorkerStart = function($worker){
    echo '开始链接' . PHP_EOL;
    $url = 'ws://stream.binance.com:9443/ws';
    $con = new AsyncTcpConnection($url);
    $con->transport = 'ssl';
    $con->proxySocks5 = '127.0.0.1:1080';
//    $con->proxyHttp = '127.0.0.1:25378';

    $con->onConnect = function(AsyncTcpConnection $con) {
        $ww = [
            'id' => 1,
            'method' => 'SUBSCRIBE',
            'params' => [
                "btcusdt@aggTrade",
                "btcusdt@depth"
            ]
        ];
        echo '链接成功';
        $con->send(json_encode($ww));
        echo 'ok';
    };

    $con->onMessage = function(AsyncTcpConnection $con, $data) {
        echo $data;
    };

    $con->onClose = function (AsyncTcpConnection $con) {
        echo 'onClose' . PHP_EOL;
    };

    $con->onError = function (AsyncTcpConnection $con, $code, $msg) {
        echo "error [ $code ] $msg\n";
    };

    $con->connect();
};
\Workerman\Worker::runAll();

proxy supports TLS1.3, no Sniproxy channel

Available commands

php start.php start
php start.php start -d
php start.php status
php start.php status -d
php start.php connections
php start.php stop
php start.php stop -g
php start.php restart
php start.php reload
php start.php reload -g

Benchmarks

https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=plaintext&l=zik073-1r

Other links with workerman

webman
AdapterMan

Donate

LICENSE

Workerman is released under the MIT license.

More Repositories

1

phpsocket.io

A server side alternative implementation of socket.io in PHP based on workerman.
PHP
2,246
star
2

webman

Probably the fastest PHP web framework in the world.
PHP
1,929
star
3

workerman-todpole

HTML5+WebSocket+PHP(Workerman) , rumpetroll server writen using php
PHP
1,839
star
4

workerman-chat

Websocket chat room written in PHP based on workerman.
PHP
1,174
star
5

GatewayWorker

Distributed realtime messaging framework based on workerman.
PHP
986
star
6

web-msg-sender

Web message pusher written in PHP based on workerman.
PHP
916
star
7

live-camera

Live camera based on HTML5+Canvas+Websocket+PHP (Workerman).
PHP
453
star
8

BrowserQuest-PHP

BrowserQuest server in PHP base on workerman. A PHP/HTML5/JavaScript multiplayer game experiment.
PHP
372
star
9

workerman-statistics

一个分布式统计监控系统 包含PHP客户端 、服务端
PHP
350
star
10

GatewayClient

Sdk For GatewayWorker
PHP
320
star
11

workerman-thrift

Thrift RPC for php based on workerman.
PHP
273
star
12

workerman-jsonrpc

workerman作为进程管理器,json作为协议的远程服务调用的框架
PHP
244
star
13

workerman-webrtc

php webrtc demo based on workerman
JavaScript
244
star
14

live-ascii-camera

利用HTML5将摄像头视频转换为ascii字符,通过websocket实时传输给其它页面。服务端使用workerman
PHP
217
star
15

mqtt

Asynchronous MQTT client for PHP based on workerman.
PHP
198
star
16

php-socks5

socks5 proxy written in PHP based on workerman.
PHP
197
star
17

php-http-proxy

HTTP proxy written in PHP based on workerman.
PHP
193
star
18

phptty

Share your terminal as a web application. PHP terminal emulator based on workerman.
PHP
170
star
19

workerman-vmstat

在浏览器里面显示以更友好的方式实时显示vmstats信息,包括内存、IO、cpu等信息
PHP
161
star
20

channel

Interprocess communication component for workerman
PHP
132
star
21

workerman-flappy-bird

flappy bird 多人在线版
PHP
120
star
22

webman-framework

webman-framework
PHP
112
star
23

workerman-for-win

workerman 3.x windows 版本(目前linux版本已经兼容windows,此版本不再维护)
PHP
109
star
24

workerman-queue

workerman 消息队列
PHP
103
star
25

GlobalData

进程间变量共享组件,用于分布式数据共享
PHP
71
star
26

workerman-todpole-web

小蝌蚪互动聊天室-适合虚拟空间使用(后端直接与workerman主机通讯。请保留页面上workerman的相关链接)
JavaScript
70
star
27

workerman-filemonitor

监控文件更新并自动reload workerman
PHP
67
star
28

workerman-manual

Workerman manual
PHP
64
star
29

crontab

A crontab written in PHP based on workerman
PHP
60
star
30

mysql

Long-living MySQL connection for daemon.
PHP
55
star
31

workerman-chat-for-win

workerman-chat windows版本
PHP
48
star
32

http-client

Asynchronous http client for PHP based on workerman.
PHP
36
star
33

rabbitmq

Asynchronous rabbitmq client for PHP based on workerman.
PHP
34
star
34

redis-queue

Message queue system written in PHP based on workerman and backed by Redis.
PHP
28
star
35

workerman-todpole-for-win

workerman-todpole-for-win
PHP
25
star
36

workerman.net

workerman.net主页源代码
PHP
25
star
37

phpsocket.io-emitter

PHP
23
star
38

workerman-MT

workerman多线程版本,同时支持Linux平台与Windows平台,接口与原Linux多进程版本兼容
PHP
22
star
39

redis

Asynchronous redis client for PHP based on workerman.
PHP
18
star
40

web-msg-sender-for-win

web-msg-sender for win
PHP
17
star
41

workerman-manual-zh

workerman中文手册
17
star
42

workerman-filemonitor-inotify

workerman文件监控并自动reload inotify版本
PHP
16
star
43

GatewayWorker-for-win

GatewayWorker for windows.
PHP
16
star
44

global-timer

Distributed timer for workerman.
PHP
15
star
45

phpsocket.io-for-win

PHP
12
star
46

webserver-example

PHP
10
star
47

tcp-proxy-demo

一个tcp代理服务器的demo
PHP
8
star
48

stomp

Asynchronous Stomp client for PHP based on workerman.
PHP
8
star
49

en.workerman.net

en.workerman.net
PHP
4
star
50

workerman-teach

PHP
4
star
51

gateway-doc

GatewayWorker manual
3
star