Processi personalizzati
In Webman puoi personalizzare i processi di ascolto o i processi, proprio come in Workerman.
Attenzione
Gli utenti Windows devono avviare Webman utilizzandophp windows.php
per avviare i processi personalizzati.
Servizio http personalizzato
A volte potresti avere un'esigenza speciale e dover modificare il codice sorgente del servizio http di Webman; in tal caso, puoi utilizzare un processo personalizzato per raggiungere il tuo obiettivo.
Ad esempio, crea il file app\Server.php
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Qui riscrive i metodi di Webman\App
}
Aggiungi la seguente configurazione in config/process.php
use Workerman\Worker;
return [
// ... Altre configurazioni omesse...
'my-http' => [
'handler' => app\Server::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Numero di processi
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // Impostazione della classe request
'logger' => \support\Log::channel('default'), // Istanza del logger
'appPath' => app_path(), // Posizione della directory app
'publicPath' => public_path() // Posizione della directory public
]
]
];
Suggerimento
Se desideri disattivare il processo http di Webman, basta impostarelisten=>''
in config/server.php
Esempio di ascolto websocket personalizzato
Crea il file 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";
}
}
Attenzione: tutte le proprietà onXXX sono pubbliche
Aggiungi la seguente configurazione in config/process.php
return [
// ... Altre configurazioni di processo omesse ...
// websocket_test è il nome del processo
'websocket_test' => [
// Qui specifica la classe del processo, cioè la classe Pusher definita sopra
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Esempio di processo non in ascolto personalizzato
Crea il file app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Controlla ogni 10 secondi se ci sono nuovi utenti registrati nel database
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
Aggiungi la seguente configurazione in config/process.php
return [
// ... Altre configurazioni di processo omesse
'task' => [
'handler' => app\TaskTest::class
],
];
Attenzione: se
listen
è omesso non ascolterà nessuna porta, secount
è omesso il numero di processi predefinito è 1.
Descrizione del file di configurazione
Una configurazione completa di un processo è definita come segue:
return [
// ...
// websocket_test è il nome del processo
'websocket_test' => [
// Qui specifica la classe del processo
'handler' => app\Pusher::class,
// Protocollo di ascolto, ip e porta (opzionale)
'listen' => 'websocket://0.0.0.0:8888',
// Numero di processi (opzionale, predefinito 1)
'count' => 2,
// Utente di esecuzione del processo (opzionale, predefinito l'utente corrente)
'user' => '',
// Gruppo utente di esecuzione del processo (opzionale, predefinito il gruppo corrente)
'group' => '',
// Se il processo supporta il reload (opzionale, predefinito true)
'reloadable' => true,
// Se attivare reusePort
'reusePort' => true,
// Transport (opzionale, impostare su ssl se necessario, predefinito tcp)
'transport' => 'tcp',
// Context (opzionale, quando il transport è ssl, è necessario fornire il percorso del certificato)
'context' => [],
// Parametri del costruttore della classe del processo, qui per process\Pusher::class (opzionale)
'constructor' => [],
// Se il processo corrente è abilitato
'enable' => true
],
];
Conclusione
I processi personalizzati di Webman sono in realtà una semplice astrazione di Workerman; essi separano la configurazione dalla logica aziendale e implementano i callback onXXX
di Workerman tramite metodi di classe, mantenendo tutte le altre funzionalità identiche a quelle di Workerman.