Processos personalizados
Em webman, você pode personalizar listeners ou processos da mesma forma que em workerman.
Nota
Usuários do Windows precisam usarphp windows.phppara iniciar o webman e poder executar processos personalizados.
Serviço HTTP personalizado
Às vezes você pode ter uma necessidade especial de modificar o código principal do serviço HTTP do webman. Nesse caso, pode usar um processo personalizado.
Por exemplo, crie o arquivo app\Server.php.
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Substitua aqui os métodos de Webman\App
}
Adicione a seguinte configuração em config/process.php.
use Workerman\Worker;
return [
// ... outras configurações omitidas ...
'my-http' => [
'handler' => app\Server::class,
'listen' => 'http://0.0.0.0:8686',
'count' => 8, // Número de processos
'user' => '',
'group' => '',
'reusePort' => true,
'constructor' => [
'requestClass' => \support\Request::class, // Classe de requisição
'logger' => \support\Log::channel('default'), // Instância de log
'appPath' => app_path(), // Localização do diretório app
'publicPath' => public_path() // Localização do diretório public
]
]
];
Dica
Para desativar o processo HTTP incorporado do webman, basta definirlisten=>''emconfig/server.php.
Exemplo de listener WebSocket personalizado
Crie 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";
}
}
Nota: todos os métodos onXXX devem ser públicos.
Adicione a seguinte configuração em config/process.php.
return [
// ... outras configurações de processo omitidas ...
// websocket_test é o nome do processo
'websocket_test' => [
// Especifique aqui a classe do processo, ou seja, a classe Pusher definida acima
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Exemplo de processo personalizado sem escuta
Crie app/TaskTest.php.
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Verificar o banco de dados a cada 10 segundos para novos registros de usuários
Timer::add(10, function(){
Db::table('users')->where('regist_timestamp', '>', time()-10)->get();
});
}
}
Adicione a seguinte configuração em config/process.php.
return [
// ... outras configurações de processo omitidas ...
'task' => [
'handler' => app\TaskTest::class
],
];
Nota: se listen for omitido, o processo não escutará em nenhuma porta; se count for omitido, o número de processos será 1 por padrão.
Explicação do arquivo de configuração
Uma configuração completa de processo é definida da seguinte forma:
return [
// ...
// websocket_test é o nome do processo
'websocket_test' => [
// Especifique aqui a classe do processo
'handler' => app\Pusher::class,
// Protocolo, IP e porta para escutar (opcional)
'listen' => 'websocket://0.0.0.0:8888',
// Número de processos (opcional, padrão 1)
'count' => 2,
// Usuário para executar o processo (opcional, padrão usuário atual)
'user' => '',
// Grupo de usuários para executar o processo (opcional, padrão grupo atual)
'group' => '',
// Se o processo atual suporta reload (opcional, padrão true)
'reloadable' => true,
// Ativar reusePort
'reusePort' => true,
// Transporte (opcional, defina como 'ssl' quando SSL for necessário, padrão 'tcp')
'transport' => 'tcp',
// Contexto (opcional, passe o caminho do certificado quando o transporte for 'ssl')
'context' => [],
// Parâmetros do construtor da classe do processo (opcional)
'constructor' => [],
// Se este processo está habilitado
'enable' => true
],
];
Conclusão
Os processos personalizados do webman são, na prática, um encapsulamento simples do workerman. Eles separam a configuração da lógica de negócios e implementam os callbacks onXXX do workerman por meio de métodos de classe. Qualquer outro uso é idêntico ao workerman.