Processi personalizzati

In Webman puoi personalizzare i processi di ascolto o i processi, proprio come in Workerman.

Attenzione
Gli utenti Windows devono avviare Webman utilizzando php 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 impostare listen=>'' 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, se count è 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.