بدون توضیح

walkor 453dbbb7c8 Update composer.json 10 سال پیش
Connection 31ce7ddea2 fix onMessage null 10 سال پیش
Events 64e5ba3535 Update Libevent.php 10 سال پیش
Lib d438e03aa2 Update Timer.php 10 سال پیش
Protocols a0ff888458 Update Http.php 10 سال پیش
.gitignore 089d22d5d5 ignore phpstorm config file 10 سال پیش
Autoloader.php 79d76850a6 fix Constants missing 10 سال پیش
MIT-LICENSE.txt c67de96f1c Create MIT-LICENSE.txt 10 سال پیش
README.md 2daba3681e Minor typos fixed 10 سال پیش
WebServer.php 53ab7fd0c8 dir change 10 سال پیش
Worker.php 240634698b add kill command 10 سال پیش
composer.json 453dbbb7c8 Update composer.json 10 سال پیش

README.md

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

<?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)
{
    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';
use Workerman\Worker;

// #### 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, $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: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';
use Workerman\Worker;

// #### 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 new connection come
$tcp_worker->onClose($connection)
{
    echo "Connection closed\n";
};

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

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 with:


## Available commands

php test.php start ```

![workerman start](http://www.workerman.net/img/workerman-start.png)  

php test.php status ```
workerman satus

php test.php restart ```


## Documentation

中文主页:[http://www.workerman.net](http://www.workerman.net)

中文文档: [http://doc3.workerman.net](http://doc3.workerman.net)

Documentation:[https://github.com/walkor/workerman-manual](https://github.com/walkor/workerman-manual/blob/master/english/src/SUMMARY.md)

# 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 <?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**

shell 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 Time per request: 0.724 ms Time per request: 0.007 ms 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

Live demo
Source code
workerman todpole

BrowserQuest

Live demo
Source code
BrowserQuest width workerman

web vmstat

Live demo
Source code
web vmstat

live-ascii-camera

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

live-camera

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

chat room

Live demo
Source code
workerman-chat

PHPSocket.IO

Live demo
Source code
phpsocket.io

statistics

Live demo
Source code
workerman-statistics

flappybird

Live demo
Source code
workerman-statistics

jsonRpc

Source code
workerman-jsonRpc

thriftRpc

Source code
workerman-thriftRpc

web-msg-sender

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

shadowsocks-php

Source code
shadowsocks-php

queue

Source code

LICENSE

Workerman is released under the MIT license.