Swoole Coroutine Fiber Async Programming Framework for PHP

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

Write your next scalable async application server with PHP coroutine and PHP fiber API.

Get started in 10 minutes Tutorial Documentation Community

Compared with other async programming frameworks or softwares such as Nginx, Tornado, Node.js, Swoole has the built-in PHP coroutine, fiber and async support, multiple threads I/O modules. 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 PHP network framework enhances the efficiency of development team.

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 swoole
    
    Mac users

    brew install php 
    #!/bin/bash
    pecl install swoole
    
  • 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' => 'www.swoole.co.uk', '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();
    
Newsletter

Join thousands others and never miss out on new tips, tutorials, and more.

Use cases

Mobile API server

Internet of Things

Micro services

Web API or web application

Gaming server

Live chat system