PHP Vanilla & FrankenPHP Worker Mode
Ao executar aplicações sem framework, microserviços ou rotinas customizadas com o FrankenPHP Worker Mode, o Leakless oferece o helper de integração: TheMattos\Leakless\Integrations\FrankenPhp\FrankenPhp.
O Script do Worker
Crie o arquivo de entrada do worker (por exemplo, worker.php):
php
<?php
declare(strict_types=1);
use TheMattos\Leakless\Config;
use TheMattos\Leakless\Integrations\FrankenPhp\FrankenPhp;
require_once __DIR__ . '/vendor/autoload.php';
// 1. Configurar limites e políticas de proteção
$config = new Config(
maxRssMb: 256.0,
maxRequests: 1000,
checkTransactions: true,
rollbackState: true,
logViolations: true,
);
// 2. Envolver o handler da aplicação no loop do FrankenPHP
FrankenPhp::run(function () {
// Lógica de atendimento da requisição
header('Content-Type: application/json');
echo json_encode([
'message' => 'Processado com segurança pelo worker persistente',
'worker_pid' => getmypid(),
'timestamp' => microtime(true),
]);
}, $config);Como o FrankenPhp::run() Opera
Internamente, o FrankenPhp::run() orquestra o ciclo de vida de execução persistente:
- Inicialização do Worker: Instancia o motor
Leaklesscom sua configuraçãoConfig. - Polling Nativo do FrankenPHP: Utiliza
frankenphp_handle_request()para aguardar requisições HTTP recebidas do servidor Caddy/Go. - Encapsulamento Automático:
- Invoca
$leakless->startRequest()antes da execução do seu handler. - Executa o handler da aplicação dentro de um bloco protegido
try / finally. - Executa
$leakless->endRequest()no blocofinallypara garantir auditoria de transações PDO, restauração de buffers/fuso horário e validação do teto de RAM.
- Invoca
- Encerramento Gracioso: Se o teto de memória RSS ou o limite de requisições for atingido, o
FrankenPhp::run()sai do loop com segurança, permitindo que o gerenciador de processos do FrankenPHP inicie um worker novo e limpo.
Loops de Eventos Customizados & Uso Manual
Se você estiver construindo seu próprio loop de eventos ou micro-framework, pode utilizar os métodos de ciclo de vida do Leakless diretamente:
php
use TheMattos\Leakless\Leakless;
use TheMattos\Leakless\Config;
$leakless = new Leakless(new Config(maxRssMb: 256.0));
while ($request = $server->accept()) {
$leakless->startRequest();
try {
$response = $app->handle($request);
$server->send($response);
} finally {
$report = $leakless->endRequest();
if ($report->shouldRecycle) {
// Finaliza o loop graciosamente
break;
}
}
}