Processos Personalizados
No Webman, você pode personalizar processos ou ouvintes da mesma forma que no Workerman.
Atenção
Usuários do Windows devem usarphp windows.php
para iniciar o Webman e poder ativar processos personalizados.
Serviço HTTP Personalizado
Às vezes, você pode ter uma necessidade especial que exige a modificação do código do núcleo do serviço HTTP do Webman. Nesse caso, você pode usar processos personalizados para implementar isso.
Por exemplo, crie o arquivo app\Server.php
<?php
namespace app;
use Webman\App;
class Server extends App
{
// Aqui você sobrescreve 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, // Configuração da classe de request
'logger' => \support\Log::channel('default'), // Instância do log
'appPath' => app_path(), // Localização do diretório app
'publicPath' => public_path() // Localização do diretório public
]
]
];
Dica
Se você quiser desativar o processo HTTP padrão do Webman, basta definirlisten=>''
em config/server.php.
Exemplo de Ouvinte WebSocket Personalizado
Crie o arquivo 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";
}
}
Atenção: todos os atributos onXXX são públicos.
Adicione a seguinte configuração em config/process.php
return [
// ... outras configurações de processos omitidas ...
// websocket_test é o nome do processo
'websocket_test' => [
// Aqui especificamos a classe do processo, que é a classe Pusher definida acima
'handler' => app\Pusher::class,
'listen' => 'websocket://0.0.0.0:8888',
'count' => 1,
],
];
Exemplo de Processo Não Ouvinte Personalizado
Crie o arquivo app/TaskTest.php
<?php
namespace app;
use Workerman\Timer;
use support\Db;
class TaskTest
{
public function onWorkerStart()
{
// Verifica a cada 10 segundos se há novos usuários registrados no banco de dados
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 processos omitidas
'task' => [
'handler' => app\TaskTest::class
],
];
Atenção: se listen for omitido, não escutará em nenhuma porta; se count for omitido, o número de processos padrão será 1.
Descrição do Arquivo de Configuração
A definição completa de um processo é como segue:
return [
// ...
// websocket_test é o nome do processo
'websocket_test' => [
// Aqui especificamos a classe do processo
'handler' => app\Pusher::class,
// Protocolo, IP e porta que será escutado (opcional)
'listen' => 'websocket://0.0.0.0:8888',
// Número de processos (opcional, padrão 1)
'count' => 2,
// Usuário que executa o processo (opcional, padrão usuário atual)
'user' => '',
// Grupo de usuário que executa o processo (opcional, padrão grupo atual)
'group' => '',
// Se o processo atual suporta reload (opcional, padrão true)
'reloadable' => true,
// Se reusePort está ativado
'reusePort' => true,
// transport (opcional, definir como ssl quando é necessário, padrão é tcp)
'transport' => 'tcp',
// context (opcional, deve passar o caminho do certificado quando transport é ssl)
'context' => [],
// Parâmetros do construtor da classe do processo, aqui são os parâmetros do construtor da classe process\Pusher::class (opcional)
'constructor' => [],
// Se o processo atual está habilitado
'enable' => true
],
];
Resumo
Os processos personalizados do Webman são na verdade uma simples encapsulação do Workerman, que separa configuração e lógica de negócios, implementando os callbacks onXXX
do Workerman através de métodos de classe. Outras utilizações são completamente iguais às do Workerman.