Inicialização do Negócio

Às vezes, precisamos realizar algumas inicializações de negócio após o início do processo. Essa inicialização é executada apenas uma vez durante o ciclo de vida do processo, por exemplo, configurar um temporizador após o início do processo ou inicializar a conexão com o banco de dados. Abaixo, explicaremos isso.

Princípio

De acordo com a descrição em Fluxo de Execução, o webman carregará as classes definidas em config/bootstrap.php (incluindo config/plugin/*/*/bootstrap.php) após o início do processo e executará o método start das classes. Podemos adicionar o código de negócio no método start para completar a operação de inicialização de negócios após o início do processo.

Fluxo

Suponha que queremos criar um temporizador para reportar periodicamente o uso de memória do processo atual. Vamos nomear esta classe de MemReport.

Comando de Execução

Execute o comando php webman make:bootstrap MemReport para gerar o arquivo de inicialização app/bootstrap/MemReport.php

Dica
Se você não instalou o webman/console, execute o comando composer require webman/console para instalá-lo.

Editando o Arquivo de Inicialização

Edite app/bootstrap/MemReport.php para que o conteúdo seja semelhante ao seguinte:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // É um ambiente de linha de comando?
        $is_console = !$worker;
        if ($is_console) {
            // Se você não quiser que o ambiente de linha de comando execute esta inicialização, retorne aqui diretamente
            return;
        }

        // Execute a cada 10 segundos
        \Workerman\Timer::add(10, function () {
            // Para facilitar a demonstração, usamos a saída em vez do processo de relatório
            echo memory_get_usage() . "\n";
        });

    }

}

Dica
Ao usar a linha de comando, o framework também executará o método start configurado em config/bootstrap.php. Podemos determinar se estamos em um ambiente de linha de comando verificando se $worker é nulo, e assim decidir se devemos executar o código de inicialização do negócio.

Configurando para Iniciar com o Processo

Abra config/bootstrap.php e adicione a classe MemReport aos itens de inicialização.

return [
    // ...outras configurações omitidas...

    app\bootstrap\MemReport::class,
];

Assim, completamos um fluxo de inicialização de negócio.

Explicações Complementares

A inicialização de processos personalizados também executará o método start configurado em config/bootstrap.php. Podemos usar $worker->name para determinar que tipo de processo é o atual e, posteriormente, usar $worker->id para verificar qual processo é, decidindo assim se o código de inicialização do negócio deve ser executado nesse processo. Por exemplo, se precisamos executar apenas no processo 0 do webman, o conteúdo de MemReport.php ficaria semelhante a isso:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // É um ambiente de linha de comando?
        $is_console = !$worker;
        if ($is_console) {
            // Se você não quiser que o ambiente de linha de comando execute esta inicialização, retorne aqui diretamente
            return;
        }

        // Execute apenas no processo 0 do webman
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // Execute a cada 10 segundos
        \Workerman\Timer::add(10, function () {
            // Para facilitar a demonstração, usamos a saída em vez do processo de relatório
            echo memory_get_usage() . "\n";
        });

    }

}