L'idea: dati in ingresso, trasformazioni in sequenza, risultato in uscita
Un'immagine caricata dall'utente deve essere: validata (dimensioni, formato), ridimensionata, compressa, convertita in WebP, caricata su CDN, e il suo URL salvato nel database. Ogni passaggio e indipendente e potrebbe essere riordinato, rimosso o aggiunto senza influenzare gli altri. Questa catena di trasformazioni e una pipeline.
La Pipeline Architecture (o Pipes and Filters) organizza il processing come una sequenza di filtri collegati da pipe. Ogni filtro riceve un input, lo trasforma, e produce un output che diventa l'input del filtro successivo. I filtri non si conoscono tra loro — conoscono solo il formato dei dati che ricevono e producono.
Struttura: Pipe, Filter, Source, Sink
- Source: il punto di ingresso dei dati (upload dell'utente, file CSV, request HTTP)
- Filter: un componente che trasforma i dati. Ha un input e un output. Non ha stato condiviso con altri filtri.
- Pipe: il connettore tra due filtri. Passa l'output di un filtro come input del successivo.
- Sink: il punto di uscita (database, file, response HTTP)
Pipeline Architecture in PHP: il middleware
Il caso più evidente di Pipeline in PHP e il middleware HTTP. Ogni middleware e un filtro che riceve la request, la può modificare, la passa al filtro successivo, e può modificare la response al ritorno:
-
CsrfMiddleware: verifica il token CSRF. Se invalido, blocca. Se valido, passa al prossimo. -
AuthMiddleware: verifica l'autenticazione. Aggiunge l'utente alla request. -
RateLimitMiddleware: verifica il rate limit. Se superato, risponde 429. -
CorsMiddleware: aggiunge gli header CORS alla response.
In Soft PHP MVC, il MiddlewarePipeline e un'implementazione pura della Pipeline Architecture: ogni middleware implementa la stessa interfaccia, viene eseguito in sequenza, e può interrompere la catena o modificare i dati che attraversano.
Esempio teorico: ETL (Extract-Transform-Load)
Un import di dati da un file CSV al database e una pipeline naturale:
- Extract: legge il CSV riga per riga (generator PHP per memoria costante)
- Validate: scarta le righe con dati invalidi, logga gli errori
- Normalize: converte date, normalizza nomi, pulisce spazi
- Deduplicate: rimuove duplicati per chiave unica
- Enrich: aggiunge dati da API esterne (geocoding, validazione email)
- Transform: mappa i campi CSV nei campi del database
- Load: inserisce nel database in batch da 500
Ogni filtro e una classe indipendente, testabile e riutilizzabile. Puoi riordinare i filtri, aggiungerne di nuovi, o rimuoverne senza toccare gli altri.
Pipeline con Generator PHP
I generator PHP sono lo strumento ideale per implementare pipeline lazy:
$result = load(transform(enrich(deduplicate(normalize(validate(extract('data.csv')))))));
Ogni funzione e un generator che yielda i risultati uno alla volta. L'intera pipeline processa un record alla volta con memoria costante, indipendentemente dalla dimensione del file.
Quando usare la Pipeline Architecture
- Usa Pipeline per processing sequenziale di dati: ETL, image processing, log parsing
- Usa Pipeline per middleware HTTP: ogni step aggiunge o verifica qualcosa
- Usa Pipeline quando i passaggi sono indipendenti e potenzialmente riordinabili
- Non usare Pipeline quando i passaggi hanno dipendenze complesse tra loro e l'ordine e rigido
- Non usare Pipeline per flussi con branching complesso: un albero di decisioni non e una pipeline
La Pipeline Architecture e la più antica e la più elegante: e la filosofia Unix applicata al software. Ogni filtro fa una cosa sola e la fa bene. Collegati insieme, risolvono problemi complessi con componenti semplici.
Top comments (0)