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
php test.php status
php test.php stop
php test.php restart
php test.php reload
Documentation
中文文档: http://doc3.workerman.net
Documentation:https://github.com/walkor/workerman-manual