Benutzerdefinierter Prozess
In webman können Sie wie in Workerman benutzerdefinierte Listener- oder Prozesse erstellen.
Hinweis
Windows-Benutzer müssenphp windows.php
verwenden, um webman zu starten und benutzerdefinierte Prozesse zu starten.
Benutzerdefinierter HTTP-Server
Manchmal haben Sie möglicherweise spezielle Anforderungen, die eine Änderung des Kerncodes des webman HTTP-Servers erfordern. In diesem Fall können Sie benutzerdefinierte Prozesse verwenden.
Beispielsweise erstellen Sie eine neue Datei app\Server.php
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Hier überschreiben Sie die Methoden von Webman\App
}
Fügen Sie die folgende Konfiguration zu config/process.php
hinzu
use Workerman\Worker;
return [
// ... Andere Konfigurationen hier ausgelassen...
'my-http' => [
'handler' => app\Server::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Anzahl der Prozesse
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'request_class' => \support\Request::class, // Anforderungsklasse einrichten
'logger' => \support\Log::channel('default'), // Protokollinstanz
'app_path' => app_path(), // Position des App-Verzeichnisses
'public_path' => public_path() // Position des Public-Verzeichnisses
]
]
];
Hinweis
Wenn Sie den mitgelieferten HTTP-Prozess von webman ausschalten möchten, setzen Sie einfachlisten => ''
in der Dateiconfig/server.php
.
Beispiel für benutzerdefinierten WebSocket-Listener
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-Eigenschaften sind public
Fügen Sie die folgende Konfiguration zu config/process.php
hinzu
return [
// ... Andere Prozesskonfigurationen hier ausgelassen ...
// websocket_test ist der Name des Prozesses
'websocket_test' => [
// Hier wird die Prozessklasse angegeben, d.h. die oben definierte Pusher-Klasse
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Beispiel für benutzerdefinierten Nicht-Listener-Prozess
Erstellen Sie app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Überprüfe alle 10 Sekunden, ob sich ein neuer Benutzer registriert hat
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
Fügen Sie die folgende Konfiguration zu config/process.php
hinzu
return [
// ... Andere Prozesskonfigurationen hier ausgelassen...
'task' => [
'handler' => app\TaskTest::class
],
];
Hinweis: Wenn listen weggelassen wird, lauscht der Prozess keinen Port. Wenn count weggelassen wird, ist die Anzahl der Prozesse standardmäßig auf 1 festgelegt.
Erklärung der Konfigurationsdatei
Eine vollständige Konfiguration für einen Prozess ist wie folgt definiert:
return [
// ...
// websocket_test ist der Prozessname
'websocket_test' => [
// Hier wird die Prozessklasse angegeben
'handler' => app\Pusher::class,
// Protokoll, IP und Port zum Lauschen (optional)
'listen' => 'websocket://0.0.0.0:8888',
// Anzahl der Prozesse (optional, standardmäßig 1)
'count' => 2,
// Benutzer, unter dem der Prozess läuft (optional, standardmäßig aktueller Benutzer)
'user' => '',
// Benutzergruppe, unter der der Prozess läuft (optional, standardmäßig aktuelle Benutzergruppe)
'group' => '',
// Ist der aktuelle Prozess reloadable? (optional, standardmäßig true)
'reloadable' => true,
// Ist reusePort aktiviert? (optional, diese Option erfordert php>=7.0, standardmäßig true)
'reusePort' => true,
// Transport (optional, wenn SSL aktiviert werden soll, auf ssl setzen, standardmäßig tcp)
'transport' => 'tcp',
// Kontext (optional, wenn transport auf ssl steht, muss der Pfad des Zertifikats übergeben werden)
'context' => [],
// Konstruktorparameter der Prozessklasse, dies sind optionale Parameter (optional)
'constructor' => [],
],
];
Zusammenfassung
Benutzerdefinierte Prozesse in webman sind eigentlich nur eine einfache Verpackung von Workerman. Es trennt die Konfiguration von der Geschäftslogik und implementiert die onXXX
-Rückrufe von Workerman durch Methoden in Klassen. Alle anderen Verwendungszwecke bleiben vollständig identisch mit Workerman.