Coroutine TCP Server: Multi Process Server Example

Latest version: pecl install openswoole-22.1.2 | composer require openswoole/core:22.1.5


Description

This example shows you how to use the coroutine TCP server with the process module from Swoole. By using the multi process module you can setup a multi process TCP server which you can manage.


Example

<?php

use OpenSwoole\Process;
use OpenSwoole\Coroutine;
use OpenSwoole\Coroutine\Server\Connection;

// We use a process pool to create a Multi-process management module
$pool = new Process\Pool(2);

// By enabling this, each callback to WorkerStart will automatically create a coroutine for you
$pool->set(['enable_coroutine' => true]);

// Creates a co::run context for you because enable_coroutine = true...
$pool->on('WorkerStart', function($pool, $id)
{
    // Each process listens on port 9501
    $server = new OpenSwoole\Coroutine\Server('127.0.0.1', 9501, false, true);

    // Handle kill triggers when a SIGTERM is sent
    Process::signal(SIGTERM, function() use ($server)
    {
        // This is how the server is stopped when a kill event is sent
        $server->shutdown();
    });

    // Receive a new connection request and automatically create a coroutine context
    $server->handle(function(Connection $connection)
    {
        // The co::run context is created for you...

        while(true)
        {
            // Receive data from the request
            $data = $connection->recv(1);

            // Handle empty data or false types
            if($data === '' || $data === false)
            {
                // Either there is no data to process or there was an error
                $errCode = OpenSwoole\Util::getLastErrorCode();
                $errMsg = socket_strerror($errCode);
                echo "errCode: {$errCode}, errMsg: {$errMsg}\n";
                $connection->close();

                // Breaks the while loop
                break;
            }

            // Send back data to the connect client
            $connection->send('hello');

            // Delay the next loop by 1 second
            Coroutine::sleep(1);
        }
    });

    // Start the server and begin listening on port 9501
    $server->start();
});

// Starting the pool means that WorkerStart is called...
$pool->start();

This example shows you how to manage multiple coroutine focused servers over a range of multi-processes by using the Swoole Process Pool. You can increase the number of processes by changing $pool = new Process\Pool(2). The number 2 means that two processes will be executed and 2 servers will be able to process requests. Each coroutine server will listen on the same IP and Port, they basically compete to take requests and connect to the client.

You could easily make this example a single process server by using $pool = new Process\Pool(1).

Last updated on September 19, 2022