# Workerman
[![Gitter](https://badges.gitter.im/walkor/Workerman.svg)](https://gitter.im/walkor/Workerman?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_co
ntent=body_badge)
[![Latest Stable Version](https://poser.pugx.org/workerman/workerman/v/stable)](https://packagist.org/packages/workerman/workerman)
[![Total Downloads](https://poser.pugx.org/workerman/workerman/downloads)](https://packagist.org/packages/workerman/workerman)
[![Mo
nthly Downloads](https://poser.pugx.org/workerman/workerman/d/monthly)](https://packagist.org/packages/workerman/workerman)
[![Daily Downloads](https://poser.pugx.org/workerman/workerman/d/daily)](https://packagist.org/packages/workerman/workerman)
[![License](https://poser.pugx.org/workerman/workerman/license)](https://packagist.org/packages/workerman/workerman)
## What is it
Workerman is an asynchro
nous event driven PHP f
ramework with high performance for easily building fast, scalable network applications. Supports HTTP, Websocket, SSL and other custom protocols. Supports libevent, [HHVM](https://github.com/facebook/hhvm) , [ReactPHP](https://github.com/reactphp/react).
## 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
```php
<?php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
// Create a Websocket server
$ws_worker = new Worker("websocket://0.0.0.0:2346");
// 4 processes
$ws_worker->count = 4;
// Emitted when new co
nnection come
$ws_worker->o
nConnect = function($connection)
{
echo "New co
nnection
";
};
// Emitted when data received
$ws_worker->o
nMessage = function($connection, $data)
{
// Send hello $data
$connection->send('hello ' . $data);
};
// Emitted when co
nnection closed
$ws_worker->o
nClose = function($connection)
{
echo "Co
nnection closed
";
};
// Run worker
Worker::runAll();
```
### An http server
```php
require_o
nce __DIR__ . '/vendor/autoload.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->o
nMessage = function($connection, $data)
{
// $_GET, $_POST, $_C
OOKIE, $_SESSION, $_SERVER, $_FILES are available
var_dump($_GET, $_POST, $_C
OOKIE, $_SESSION, $_SERVER, $_FILES);
// send data to client
$connection->send("hello world
");
};
// run all workers
Worker::runAll();
```
### A WebServer
```php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWebServer;
use WorkermanWorker;
// 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
```php
require_o
nce __DIR__ . '/vendor/autoload.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 co
nnection come
$tcp_worker->o
nConnect = function($connection)
{
echo "New Co
nnection
";
};
// Emitted when data received
$tcp_worker->o
nMessage = function($connection, $data)
{
// send data to client
$connection->send("hello $data
");
};
// Emitted when new co
nnection come
$tcp_worker->o
nClose = function($connection)
{
echo "Co
nnection closed
";
};
Worker::runAll();
```
### Enable SSL
```php
<?php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
// SSL context.
$co
ntext = array(
'ssl' => array(
'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->o
nMessage = function($connection, $data)
{
// Send hello $data
$connection->send('hello ' . $data);
};
Worker::runAll();
```
### Custom protocol
Protocols/MyTextProtocol.php
```php
namespace Protocols;
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 tri
m($recv_buffer);
}
public static function encode($data)
{
return $data."
";
}
}
```
```php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
$text_worker->o
nConnect = function($connection)
{
echo "New co
nnection
";
};
$text_worker->o
nMessage = function($connection, $data)
{
// send data to client
$connection->send("hello world
");
};
$text_worker->o
nClose = function($connection)
{
echo "Co
nnection closed
";
};
// run all workers
Worker::runAll();
```
### Timer
```php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
use WorkermanLibTimer;
$task = new Worker();
$task->o
nWorkerStart = function($task)
{
// 2.5 seco
nds
$time_interval = 2.5;
$timer_id = Timer::add($time_interval,
function()
{
echo "Timer run
";
}
);
};
// run all workers
Worker::runAll();
```
### AsyncTcpCo
nnection (tcp/ws/text/f
rame etc...)
```php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
use WorkermanConnectionAsyncTcpConnection;
$worker = new Worker();
$worker->o
nWorkerStart = function()
{
// Websocket protocol for client.
$ws_co
nnection = new AsyncTcpCo
nnection("ws://echo.websocket.org:80");
$ws_connection->o
nConnect = function($connection){
$connection->send('hello');
};
$ws_connection->o
nMessage = function($connection, $data){
echo "recv: $data
";
};
$ws_connection->o
nError = function($connection, $code, $msg){
echo "error: $msg
";
};
$ws_connection->o
nClose = function($connection){
echo "co
nnection closed
";
};
$ws_connection->co
nnect();
};
Worker::runAll();
```
### Async Mysql of ReactPHP
```
composer require react/mysql
```
```php
<?php
require_o
nce __DIR__ . '/vendor/autoload.php';
use WorkermanWorker;
$worker = new Worker('tcp://0.0.0.0:6161');
$worker->o
nWorkerStart = function() {
global $mysql;
$loop = Worker::getEventLoop();
$mysql = new ReactMySQLCo
nnection($loop, array(
'host' => '127.0.0.1',
'dbname' => 'dbname',
'user' => 'user',
'passwd' => 'passwd',
));
$mysql->on('error', function($e){
echo $e;
});
$mysql->co
nnect(function ($e) {
if($e) {
echo $e;
} else {
echo "co
nnect success