Powering the next-generation microservices and application

Build high-performance, scalable, concurrent TCP, UDP, Unix Socket, HTTP, WebSocket services with PHP and easy to use coroutine, fibers API

Write your next scalable async application with PHP coroutines and fibers.

Github News & Tutorial Installation Docker Images Documentation

Compared with other async programming frameworks or software such as Nginx, Tornado, Node.js, Open Swoole is a complete async solution that has built-in support for async programming via fibers/coroutines, a range of multi-threaded I/O modules (HTTP Server, WebSockets, TaskWorkers, Process Pools) and support for popular PHP clients like PDO for MySQL, Redis and CURL.

You can use sync or async, coroutine, fiber API to write the applications or create thousands of light weight fibers within one Linux process.

Swoole enhances the efficiency of your PHP applications and brings you out of the traditional stateless model, enabling you to focus on the development of innovative products at high scale, brining event loops and asynchronous programming to the PHP language.

Event-driven, PHP Coroutine, PHP Fiber, Asynchronous API

Async TCP / UDP / HTTP / Websocket / HTTP2 Client / Server Side API

IPv4 / IPv6 / UnixSocket / TCP / UDP and SSL / TLS / DTLS

Native PHP Coroutine and PHP Fiber Support

High performance, scalable, support C1000K

Milliseconds task scheduler

Free and Open Source (Apache 2 License)

Multiprocessing and Daemonize

Get Started

  • 1

    Installation

    Linux users

    #!/bin/bash
    pecl install openswoole
    
    Mac users

    brew install php 
    #!/bin/bash
    pecl install openswoole
    
  • 2

    HTTP Server

    <?php
    $server = new Swoole\HTTP\Server("127.0.0.1", 9501);
    
    $server->on("start", function (Swoole\Http\Server $server) {
        echo "Swoole http server is started at http://127.0.0.1:9501\n";
    });
    
    $server->on("request", function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
        $response->header("Content-Type", "text/plain");
        $response->end("Hello World\n");
    });
    
    $server->start();
    
  • 3

    WebSocket Server

    <?php
    $server = new Swoole\Websocket\Server("127.0.0.1", 9502);
    
    $server->on('open', function($server, $req) {
        echo "connection open: {$req->fd}\n";
    });
    
    $server->on('message', function($server, $frame) {
        echo "received message: {$frame->data}\n";
        $server->push($frame->fd, json_encode(["hello", "world"]));
    });
    
    $server->on('close', function($server, $fd) {
        echo "connection close: {$fd}\n";
    });
    
    $server->start();
    
  • 4

    TCP Server

    <?php
    $server = new Swoole\Server("127.0.0.1", 9503);
    $server->on('connect', function ($server, $fd){
        echo "connection open: {$fd}\n";
    });
    $server->on('receive', function ($server, $fd, $from_id, $data) {
        $server->send($fd, "Swoole: {$data}");
        $server->close($fd);
    });
    $server->on('close', function ($server, $fd) {
        echo "connection close: {$fd}\n";
    });
    $server->start();
    
  • 5

    Coroutine TCP Client

    <?php
    $client = new Swoole\Client(SWOOLE_SOCK_TCP);
    if (!$client->connect('127.0.0.1', 9501, 0.5)) {
        exit("connect failed. Error: {$client->errCode}\n");
    }
    $client->send("hello world\n");
    echo $client->recv();
    $client->close();
    
  • 6

    Coroutine Redis / HTTP / WebSocket Client

    <?php
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect('127.0.0.1', 6379);
    $val = $redis->get('key');
    echo $val;
    $http = new Swoole\Coroutine\Http\Client('127.0.0.1', 80);
    $http->get('/index.php');
    echo $http->body;
    $http->close();
    
  • 7

    Coroutine Tasks

    <?php
    $server = new Swoole\Http\Server("0.0.0.0", 9501, SWOOLE_BASE);
    $server->set([
        'worker_num' => 1,
        'task_worker_num' => 2,
    ]);
    $server->on('Request', function ($request, $response) use ($server) {
        $tasks[0] = ['time' => 0];
        $tasks[1] = ['data' => 'openswoole.com', 'code' => 200];
        $result = $server->taskCo($tasks, 1.5);
        $response->end('<pre>Task Result: '.var_export($result, true));
    });
    $server->on('Task', function (Swoole\Server $server, $task_id, $worker_id, $data) {
        if ($server->worker_id == 1) {
            sleep(1);
        }
        $data['done'] = time();
        $data['worker_id'] = $server->worker_id;
        return $data;
    });
    $server->start();
    
Community

Join 2,000+ others and never miss out on new tips, tutorials, and more.

Github Twitter Newsletter Slack Discord Support

Open Swoole Use Cases

Mobile API Server

Internet of Things (IoT Solutions)

Micro Services

Realtime Trading Engine

Gaming Server

Live Chat System

Swoole Resources