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

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

// Run worker
Worker::runAll();

An http server

test.php

require_once './Workerman/Autoloader.php';
use WorkermanWorker;

// #### 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 
");
};

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

A WebServer

test.php

require_once './Workerman/Autoloader.php';
use WorkermanWebServer;

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

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

// Emitted when data received
$tcp_worker->onMessage = function($connection, $data)
{
    // send data to client
    $connection->send("hello $data 
");
};

// Emitted when new connection come
$tcp_worker->onClose = function($connection)
{
    echo "Connection closed
";
};

Worker::runAll();

Custom protocol

Protocols/MyTextProtocol.php

namespace Protocols;
/**
 * User defined protocol
 * Format Text+"
"
 */
class MyTextProtocol
{
    public static function input($recv_buffer)
    {
        // Find the position of the first occurrence of "
"
        $pos = strpos($recv_buffer, "
");
        // 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."
";
    }
}

test.php

require_once './Workerman/Autoloader.php';
use WorkermanWorker;

// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");

$text_worker->onConnect = function($connection)
{
    echo "New connection
";
};

$text_worker->onMessage =  function($connection, $data)
{
    // send data to client
    $connection->send("hello world 
");
};

$text_worker->onClose = function($connection)
{
    echo "Connection closed
";
};

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

Timer

test.php

require_once './Workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanLibTimer;

$task = new Worker();
$task->onWorkerStart = function($task)
{
    // 2.5 seconds
    $time_interval = 2.5; 
    $timer_id = Timer::add($time_interval, 
        function()
        {
            echo "Timer run
";
        }
    );
};

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

原文地址:https://www.cnblogs.com/chunguang/p/5715533.html