Processus Personnalisé

Dans webman, vous pouvez personnaliser l'écoute ou les processus comme avec workerman.

Attention
Les utilisateurs de Windows doivent utiliser php windows.php pour démarrer webman afin de lancer des processus personnalisés.

Service http Personnalisé

Il arrive que vous ayez des besoins spécifiques nécessitant des changements dans le code de cœur du service http de webman, dans ce cas, vous pouvez utiliser un processus personnalisé.

Par exemple, créez app\Server.php

<?php

namespace app;

use Webman\App;

class Server extends App
{
    // Ici, redéfinissez les méthodes de Webman\App
}

Ajoutez la configuration suivante dans config/process.php

use Workerman\Worker;

return [
    // ... D'autres configurations omises...

    'my-http' => [
        'handler' => app\Server::class,
        'listen' => 'http://0.0.0.0:8686',
        'count' => 8, // Nombre de processus
        'user' => '',
        'group' => '',
        'reusePort' => true,
        'constructor' => [
            'requestClass' => \support\Request::class, // Paramètre de la classe request
            'logger' => \support\Log::channel('default'), // Instance de journalisation
            'appPath' => app_path(), // Emplacement du répertoire app
            'publicPath' => public_path() // Emplacement du répertoire public
        ]
    ]
];

Suggestion
Si vous souhaitez désactiver le processus http intégré de webman, il vous suffit de définir listen=>'' dans config/server.php.

Exemple d'Écoute Websocket Personnalisée

Créez app/Pusher.php

<?php
namespace app;

use Workerman\Connection\TcpConnection;

class Pusher
{
    public function onConnect(TcpConnection $connection)
    {
        echo "onConnect\n";
    }

    public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
    {
        echo "onWebSocketConnect\n";
    }

    public function onMessage(TcpConnection $connection, $data)
    {
        $connection->send($data);
    }

    public function onClose(TcpConnection $connection)
    {
        echo "onClose\n";
    }
}

Attention : tous les attributs onXXX sont publics.

Ajoutez la configuration suivante dans config/process.php

return [
    // ... Autres configurations de processus omises ...

    // websocket_test est le nom du processus
    'websocket_test' => [
        // Ici, spécifiez la classe du processus, c'est-à-dire la classe Pusher définie ci-dessus
        'handler' => app\Pusher::class,
        'listen'  => 'websocket://0.0.0.0:8888',
        'count'   => 1,
    ],
];

Exemple de Processus Non Écoute Personnalisé

Créez app/TaskTest.php

<?php
namespace app;

use Workerman\Timer;
use support\Db;

class TaskTest
{

    public function onWorkerStart()
    {
        // Vérifiez toutes les 10 secondes si de nouveaux utilisateurs se sont inscrits dans la base de données
        Timer::add(10, function(){
            Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
        });
    }

}

Ajoutez la configuration suivante dans config/process.php

return [
    // ... Autres configurations de processus omises

    'task' => [
        'handler'  => app\TaskTest::class
    ],
];

Attention : si listen est omis, aucun port ne sera écouté, si count est omis, le nombre de processus par défaut est 1.

Description du Fichier de Configuration

Une définition complète de configuration d'un processus est comme suit :

return [
    // ... 

    // websocket_test est le nom du processus
    'websocket_test' => [
        // Ici, spécifiez la classe du processus
        'handler' => app\Pusher::class,
        // Protocole, ip et port à écouter (optionnel)
        'listen'  => 'websocket://0.0.0.0:8888',
        // Nombre de processus (optionnel, par défaut 1)
        'count'   => 2,
        // Utilisateur de fonctionnement du processus (optionnel, par défaut utilisateur actuel)
        'user'    => '',
        // Groupe d'utilisateur de fonctionnement (optionnel, par défaut groupe actuel)
        'group'   => '',
        // Indique si le processus prend en charge le rechargement (optionnel, par défaut true)
        'reloadable' => true,
        // Indique s'il faut activer reusePort
        'reusePort'  => true,
        // transport (optionnel, à définir sur ssl lorsque ssl est activé, par défaut tcp)
        'transport'  => 'tcp',
        // context (optionnel, à fournir lorsque le transport est ssl, pour transmettre le chemin du certificat)
        'context'    => [], 
        // Paramètres du constructeur de classe de processus, ici pour les paramètres de constructeurs de process\Pusher::class (optionnel)
        'constructor' => [],
        // Indique si le processus est activé
        'enable' => true
    ],
];

Résumé

Le processus personnalisé de webman est en réalité un simple encapsulage de workerman, qui sépare la configuration de la logique d'affaires et implémente les callbacks onXXX de workerman via les méthodes de classe, tout en conservant les mêmes usages que workerman.