Processus Personnalisé
Dans webman, vous pouvez personnaliser l'écoute ou les processus comme avec workerman.
Attention
Les utilisateurs de Windows doivent utiliserphp 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éfinirlisten=>''
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.