Usando o Yii com Rapira
O Rapira é um servidor de aplicação PHP escrito em Rust que embute o interpretador PHP. O runner do Yii para Rapira suporta os modos classic, worker e dispatcher. Os modos worker e dispatcher inicializam a aplicação uma vez por worker e a reaproveitam nas requisições seguintes. Veja Usando o Yii com event loop para as implicações de manter a aplicação na memória.
Instalação
O runner exige PHP 8.4–8.5. Instale o binário do Rapira seguindo as instruções de instalação do Rapira, com uma versão do PHP suportada pelo runner. Os pacotes do Composer fornecem a integração com o Yii; o binário do servidor precisa ser instalado à parte.
Instale o runner e o pacote de contratos dele na sua aplicação Yii:
composer require yiisoft/yii-runner-rapira:@dev rapira/contract:@devEssas flags de estabilidade permitem as versões de desenvolvimento usadas nas instruções de instalação do runner.
Configuração
O exemplo a seguir supõe uma aplicação baseada em yiisoft/app ou yiisoft/app-api, com App\Environment e src/bootstrap.php fornecidos pelo template.
Script de entrada do worker
Crie worker.php na raiz da aplicação:
<?php
declare(strict_types=1);
use App\Environment;
use Psr\Log\LogLevel;
use Yiisoft\ErrorHandler\ErrorHandler;
use Yiisoft\ErrorHandler\Renderer\PlainTextRenderer;
use Yiisoft\Log\Logger;
use Yiisoft\Log\StreamTarget;
use Yiisoft\Yii\Runner\Rapira\RapiraApplicationRunner;
$root = __DIR__;
require_once $root . '/src/bootstrap.php';
$runner = new RapiraApplicationRunner(
rootPath: $root,
debug: Environment::appDebug(),
checkEvents: Environment::appDebug(),
environment: Environment::appEnv(),
temporaryErrorHandler: new ErrorHandler(
new Logger(
[
(new StreamTarget())->setLevels([
LogLevel::EMERGENCY,
LogLevel::ERROR,
LogLevel::WARNING,
]),
],
),
new PlainTextRenderer(),
),
);
$runner->run();O runner cria o container, inicia a aplicação, converte as requisições recebidas em requisições PSR-7 e emite as respostas. Ele detecta o modo de execução do Rapira, então o mesmo script de entrada serve para os três modos.
Configuração do servidor
Crie rapira.toml ao lado de worker.php:
[http]
listen = "127.0.0.1:8000"
[http.pool]
entrypoint = "worker.php"
mode = "worker"
max_requests = 1000Essa configuração escuta na interface de loopback e recicla cada worker depois de 1.000 requisições. Para servir arquivos de public, siga a configuração de arquivos estáticos do Rapira. Veja a referência de configuração para as outras opções do servidor e do pool.
Iniciando o servidor
Execute o seguinte comando na raiz da aplicação:
rapira serve rapira.tomlAbra http://127.0.0.1:8000 para acessar a aplicação. Reinicie o servidor depois de alterar o código ou a configuração da aplicação.
Modos de execução
Defina mode na seção [http.pool] do rapira.toml para escolher como as requisições são processadas:
classicinicializa a aplicação a cada requisição, como no PHP-FPM.workermantém a aplicação na memória e recebe as requisições pelas superglobais da SAPI do PHP.dispatchermantém a aplicação na memória e recebe objetos de requisição pela API de dispatcher do Rapira. O runner do Yii processa essas requisições sequencialmente dentro de cada worker.
Veja os modos de execução do Rapira para mais detalhes.
Sobre o escopo do worker
Nos modos worker e dispatcher, os serviços podem manter estado entre requisições. O runner chama Yiisoft\Di\StateResetter::reset() depois de cada requisição, mas você precisa configurar resetters para os seus próprios serviços com estado. Veja a documentação do Yii DI.
A opção max_requests limita quanto tempo um worker vive; ela não substitui a redefinição do estado específico de cada requisição.
Configuração adicional
O RapiraApplicationRunner usa por padrão os grupos de configuração web dos templates de aplicação. O construtor aceita grupos alternativos, diretórios de configuração e um error handler temporário. Use withConfig() para fornecer uma instância de configuração personalizada ou withContainer() para fornecer um container PSR-11. Veja a documentação do runner para exemplos.