Manipulação de Argumentos em Scripts PHP CLI com getopt()

A execução de scripts PHP via interface de linha de comando (CLI) é uma prática fundamental para automação de tarefas, processametno de filas e rotinas de manutenção (cron jobs). Para tornar esses scripts flexíveis, é essencial capturar e tratar argumentos passados pelo terminal. A função nativa getopt() é a ferramenta padrão do PHP para essa finalidade.

Fundamentos da função getopt()

A assinatura básica da função é:

getopt(string $short_options, array $long_options = [], int &$rest_index = null): array|false

O foco principal são as short_options, onde cada caractere define uma flag. Existem três níveis de parametrização:

  • Caractere único: Define uma opção que não aceita valores (funciona como um booleano/flag).
  • Caractere seguido de um dois-pontos (:): Indica que o parâmetro requer obrigatoriamente um valor.
  • Caractere seguido de dois dois-pontos (::): Indica que o parâmetro aceita um valor opcional.

Implementação Prática de um Script de Automação

Abaixo, apresentamos um exemplo de script estruturado para processar tarefas específicas (como sincronização de dados) baseando-se em parâmetros de ação e tempo.

<?php

/**
 * Script CLI para processamento de tarefas agendadas.
 * Parâmetros:
 * -a: Nome da ação (obrigatório)
 * -p: Período/Timestamp (opcional)
 * -h: Ajuda
 */

$opcoes = getopt("a:p::h");

// Validação inicial
if (!$opcoes || isset($opcoes['h'])) {
    exibirManual();
    exit(1);
}

if (!isset($opcoes['a'])) {
    echo "Erro: O parâmetro de ação (-a) é obrigatório.\n";
    exit(1);
}

$acao = $opcoes['a'];
$periodoRaw = $opcoes['p'] ?? null;

// Tratamento de timestamps
$inicio = $fim = null;
if ($periodoRaw) {
    $segmentos = explode('-', $periodoRaw);
    $inicio = (int)$segmentos[0];
    
    if (count($segmentos) === 2) {
        $fim = (int)$segmentos[1];
    } else {
        $fim = time();
    }
}

// Roteamento de tarefas
switch ($acao) {
    case 'vendas':
        processarSincronizacaoVendas($inicio, $fim);
        break;
    case 'estoque':
        echo "Iniciando atualização de estoque...\n";
        // Lógica de estoque aqui
        break;
    default:
        echo "Ação desconhecida: $acao\n";
        break;
}

function processarSincronizacaoVendas($start, $end) {
    if (!$start) $start = strtotime("-24 hours");
    
    echo "Sincronizando vendas de " . date('Y-m-d H:i:s', $start) . " até " . date('Y-m-d H:i:s', $end) . "\n";
    
    // Simulação de processamento em lotes
    $passo = 3600; // 1 hora
    for ($atual = $start; $atual < $end; $atual += $passo) {
        $proximo = min($atual + $passo, $end);
        executarTarefaInterna($atual, $proximo);
    }
}

function executarTarefaInterna($ts1, $ts2) {
    // Lógica de negócio
}

function exibirManual() {
    $manual = <<<text ajuda.="" argumentos:="" da="" de="" do="" echo="" este="" estoque="" exibe="" guia="" intervalo="" nome="" ou="" php="" script.php="" script:="" tarefa="" text="" timestamp="" uso="" vendas=""></text>

Nuances e Comportamentos do getopt()

1. Atribuição de Valores Obrigatórios

Para opções definidas com um dois-pontos (ex: a:), o PHP aceita o valor de três formas:

php script.php -avendas
php script.php -a=vendas
php script.php -a vendas

2. Atribuição de Valores Opcionais

Para opções com dois dois-pontos (ex: p::), o PHP é mais restritivo. Não deve haver espaço entre o parâmetro e o valor se não for utilizado o sinal de igual:

# Correto
php script.php -p123456
php script.php -p=123456

# Incorreto (Resultará em 'false' para o parâmetro p)
php script.php -p 123456

3. Manipulação de Flags

Parâmetros simples (sem dois-pontos) retornam sempre bool(false) se estiverem presentes no comando. Sua existência no array retornado por getopt() indica que o usuário ativou aquela flag.

4. Múltiplas Ocorrências

Se um parâmetro for passado várias vezes no mesmo comando, o getopt() converterá o valor associado em um array contendo todas as entradas fornecidas:

# Comando
php script.php -a task1 -a task2

# Resultado no PHP
["a"] => ["task1", "task2"]

Tags: PHP CLI backend automation

Publicado em 7-14 19:21