reusePort

Attention
Nécessite workerman>= 3.2.1 PHP>=7.0, les systèmes Windows et Mac OS ne supportent pas cette fonctionnalité.

Description:

bool Worker::$reusePort

Détermine si le worker actuel active la réutilisation des ports d'écoute (option SO_REUSEPORT du socket).

En activant la réutilisation des ports d'écoute, plusieurs processus sans relation parent-enfant peuvent écouter le même port, et le noyau du système effectue un équilibrage de charge pour décider à quel processus le socket connecté est attribué, évitant ainsi l'effet de foule et améliorant la performance des applications multi-processus à connexions courtes.

Attention : Cette fonctionnalité nécessite une version PHP >= 7.0

Exemple 1

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8484');
$worker->count = 4;
$worker->reusePort = true;
$worker->onMessage = function(TcpConnection $connection, $data)
{
    $connection->send('ok');
};
// Exécuter le worker
Worker::runAll();

Exemple 2 : Écoute de plusieurs ports (multi-protocoles) avec Workerman

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('text://0.0.0.0:2015');
$worker->count = 4;
// Après le démarrage de chaque processus, un nouvel écouteur est ajouté dans le processus actuel
$worker->onWorkerStart = function($worker)
{
    $inner_worker = new Worker('http://0.0.0.0:2016');
    /**
     * Plusieurs processus écoutent le même port (les sockets d'écoute ne sont pas hérités du processus parent)
     * Nécessite d'activer la réutilisation des ports, sinon une erreur Address already in use sera levée
     */
    $inner_worker->reusePort = true;
    $inner_worker->onMessage = 'on_message';
    // Exécuter l'écoute
    $inner_worker->listen();
};

$worker->onMessage = 'on_message';

function on_message(TcpConnection $connection, $data)
{
    $connection->send("hello\n");
}

// Exécuter le worker
Worker::runAll();