Benutzerdefinierte Prozesse

In Webman können Sie wie in Workerman benutzerdefinierte Listener oder Prozesse erstellen.

Hinweis
Windows-Benutzer müssen php windows.php verwenden, um Webman zu starten, um benutzerdefinierte Prozesse zu starten.

Benutzerdefinierter HTTP-Dienst

Manchmal haben Sie möglicherweise spezifische Anforderungen, die eine Änderung des Kerncodes des Webman HTTP-Dienstes erfordern. In diesem Fall können Sie benutzerdefinierte Prozesse verwenden.

Erstellen Sie beispielsweise app\Server.php

<?php

namespace app;

use Webman\App;

class Server extends App
{
    // Hier überschreiben Sie die Methoden von Webman\App
}

Fügen Sie in config/process.php die folgende Konfiguration hinzu

use Workerman\Worker;

return [
    // ... andere Konfigurationen wurden hier weggelassen...

    'my-http' => [
        'handler' => app\Server::class,
        'listen' => 'http://0.0.0.0:8686',
        'count' => 8, // Anzahl der Prozesse
        'user' => '',
        'group' => '',
        'reusePort' => true,
        'constructor' => [
            'requestClass' => \support\Request::class, // request-Klassen-Einstellung
            'logger' => \support\Log::channel('default'), // Protokollinstanz
            'appPath' => app_path(), // Speicherort des app-Verzeichnisses
            'publicPath' => public_path() // Speicherort des public-Verzeichnisses
        ]
    ]
];

Hinweis
Wenn Sie den mitgelieferten HTTP-Prozess von Webman deaktivieren möchten, setzen Sie einfach in config/server.php listen=>''.

Beispiel für benutzerdefiniertes WebSocket-Listening

Erstellen Sie 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";
    }
}

Hinweis: Alle onXXX-Attribute sind public

Fügen Sie in config/process.php die folgende Konfiguration hinzu

return [
    // ... andere Prozesskonfigurationen wurden weggelassen ...

    // websocket_test ist der Prozessname
    'websocket_test' => [
        // Hier geben Sie die Prozessklasse an, das ist die oben definierte Pusher-Klasse
        'handler' => app\Pusher::class,
        'listen'  => 'websocket://0.0.0.0:8888',
        'count'   => 1,
    ],
];

Beispiel für benutzerdefinierte Nicht-Listening-Prozesse

Erstellen Sie app/TaskTest.php

<?php
namespace app;

use Workerman\Timer;
use support\Db;

class TaskTest
{

    public function onWorkerStart()
    {
        // Alle 10 Sekunden überprüfen, ob neue Benutzer im Database registriert sind
        Timer::add(10, function(){
            Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
        });
    }

}

Fügen Sie in config/process.php die folgende Konfiguration hinzu

return [
    // ... andere Prozesskonfigurationen wurden weggelassen ...

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

Hinweis: Wenn listen weggelassen wird, wird kein Port überwacht, wenn count weggelassen wird, beträgt die Standardanzahl der Prozesse 1.

Erläuterung der Konfigurationsdatei

Eine vollständige Konfigurationsdefinition für einen Prozess sieht wie folgt aus:

return [
    // ... 

    // websocket_test ist der Prozessname
    'websocket_test' => [
        // Hier geben Sie die Prozessklasse an
        'handler' => app\Pusher::class,
        // Überwachtes Protokoll, IP und Port (optional)
        'listen'  => 'websocket://0.0.0.0:8888',
        // Anzahl der Prozesse (optional, Standard 1)
        'count'   => 2,
        // Benutzer, unter dem der Prozess ausgeführt wird (optional, Standard aktueller Benutzer)
        'user'    => '',
        // Benutzergruppe, unter der der Prozess ausgeführt wird (optional, Standard aktuelle Benutzergruppe)
        'group'   => '',
        // Ob der aktuelle Prozess Reload unterstützt (optional, Standard true)
        'reloadable' => true,
        // Ob reusePort aktiviert ist 
        'reusePort'  => true,
        // transport (optional, wenn SSL aktiviert werden muss, auf ssl setzen, Standard tcp)
        'transport'  => 'tcp',
        // context (optional, wenn transport ssl ist, muss der Pfad zum Zertifikat übergeben werden)
        'context'    => [], 
        // Konstruktorparameter der Prozessklasse, hier Parameter des Prozesses\Pusher::class (optional)
        'constructor' => [],
        // Ob der aktuelle Prozess aktiviert ist
        'enable' => true
    ],
];

Zusammenfassung

Der benutzerdefinierte Prozess von Webman ist tatsächlich eine einfache Verpackung von Workerman, die Konfiguration und Geschäftslogik trennt und die onXXX-Rückrufe von Workerman durch Klassenmethoden implementiert. Die anderen Anwendungen sind identisch zu Workerman.