Aumentare il Timeout delle Chiamate HTTP con http_request_timeout

WordPress comunica continuamente con server esterni. Lo fa per aggiornare estensioni, interrogare API o sincronizzare feed.

A volte il server remoto risponde troppo lentamente. In questo caso WordPress blocca la connessione e genera un errore di timeout.

Possiamo risolvere facilmente questo problema via codice. Utilizzeremo il filtro http_request_timeout per estendere il tempo di attesa standard.

Come funzionano le richieste HTTP in WordPress

L’architettura della WordPress HTTP API

WordPress gestisce le chiamate esterne con una classe unificata chiamata WP_Http. Questa architettura usa librerie avanzate come cURL oppure gli stream PHP interni.

Le funzioni comuni includono wp_remote_get() e wp_remote_post(). Ognuna di queste funzioni invia richieste verso servizi terzi.

Se il server remoto tarda a rispondere, l’operazione fallisce. Trovi tutti i dettagli tecnici nella nostra guida su come risolvere l’errore cURL 28 in WordPress.

Il valore di timeout predefinito

Il tempo limite standard impostato da WordPress è di soli 5 secondi. Questo intervallo evita che le pagine web rimangano bloccate.

Tuttavia, 5 secondi possono essere insufficienti per molte API esterne. I servizi complessi richiedono spesso un tempo di risposta maggiore.

Quando il tempo scade, la transazione si interrompe bruscamente. Il sito genera un avviso critico o blocca il salvataggio dei dati.

Implementare il filtro http_request_timeout nel tuo sito

Dove inserire il codice personalizzato

Non modificare mai i file core della piattaforma. Le modifiche andrebbero perse al primo aggiornamento del software.

Puoi inserire lo snippet nel file functions.php del tuo tema child. In alternativa, puoi utilizzare un plugin dedicato per gli snippet di codice come WPCode.

La creazione di un mu-plugin (Must-Use plugin) rappresenta la soluzione migliore. Questo metodo garantisce che il codice rimanga sempre attivo.

Snippet di codice di base

Vediamo ora come registrare la nostra funzione di callback. Useremo il filtro http_request_timeout per impostare un nuovo limite globale a 30 secondi.

add_filter( 'http_request_timeout', 'nc_aumenta_timeout_http', 10, 1 );
function nc_aumenta_timeout_http( $timeout ) {
    return 30; // Imposta il timeout a 30 secondi
}

Questo frammento di codice sovrascrive il valore nativo. Da questo momento ogni chiamata aspetterà fino a mezzo minuto.

Avviso di sicurezza: Non impostare valori eccessivamente alti come 120 o 300 secondi. Un timeout troppo lungo può esaurire rapidamente i processi PHP-FPM del server.

Filtrare il timeout in modo mirato e condizionale

Perché evitare un aumento globale indiscriminato

Aumentare il tempo per ogni richiesta può rallentare l’amministrazione del sito. Se un server esterno è offline, l’utente attenderà inutilmente.

La soluzione ideale consiste nell’intercettare solo le chiamate critiche. Possiamo controllare l’indirizzo di destinazione prima di estendere il tempo limite.

Questo approccio selettivo mantiene il resto della piattaforma rapido e reattivo.

Snippet avanzato con controllo dell’URL

Per applicare la regola solo a una specifica API, sfruttiamo il secondo parametro disponibile. Analizziamo l’URL prima di applicare il nuovo valore.

add_filter( 'http_request_timeout', 'nc_timeout_selettivo', 10, 2 );
function nc_timeout_selettivo( $timeout, $url ) {
    if ( false !== strpos( $url, 'api.servizio-esterno.com' ) ) {
        return 45; // 45 secondi solo per questo endpoint
    }
    return $timeout; // Mantiene il valore standard per gli altri
}

In questo modo il filtro http_request_timeout agisce unicamente sulle risorse lente. Il resto del traffico HTTP mantiene i parametri standard.

Metodi alternativi per modificare la durata delle richieste

Impostare il timeout negli argomenti di wp_remote_get

Se sei l’autore del codice o del plugin, non hai bisogno di filtri globali. Puoi definire il parametro direttamente nell’array dei parametri.

Basta impostare la chiave timeout durante la chiamata:

$args = array(
    'timeout'     => 20,
    'redirection' => 5,
);
$response = wp_remote_get( 'https://api.esempio.com/dati', $args );

Questa tecnica offre il massimo controllo per gli sviluppatori. Isola completamente l’istruzione dal resto dell’ecosistema WordPress.

Intervenire con il filtro http_request_args

Esiste anche un’altra alternativa molto potente. Si tratta del filtro http_request_args, che modifica l’intero array di configurazione della richiesta.

Questo hook permette di intervenire su intestazioni HTTP, metodi e timeout. Tuttavia, per il solo tempo limite, l’apposito filtro http_request_timeout risulta più leggibile e immediato.

Migliori pratiche e risoluzione problemi

Verificare i log degli errori del server

Se gli errori persistono, analizza i log di PHP e di Apache o Nginx. Spesso i problemi derivano da firewall troppo restrittivi.

I sistemi di sicurezza esterni possono bloccare le chiamate in uscita. Assicurati che le porte 80 e 443 siano aperte sul tuo hosting.

Controlla anche la configurazione DNS del server. Una risoluzione lenta dei nomi di dominio consuma secondi preziosi prima ancora di avviare la connessione.

Procedura di verifica passo-passo

  1. Accedi via FTP o pannello hosting alla cartella /wp-content/mu-plugins/.
  2. Crea un nuovo file chiamato custom-timeout.php.
  3. Incolla lo snippet di codice PHP descritto in questa guida.
  4. Salva il file e ricarica la dashboard di WordPress.
  5. Verifica se il processo che prima andava in errore ora viene completato regolarmente.

Domande Frequenti (FAQ)

Qual è il timeout predefinito per le richieste HTTP in WordPress?

Il valore predefinito impostato dagli sviluppatori di WordPress è di 5 secondi per le normali chiamate. Per le richieste non bloccanti o in cron background, il limite può scendere fino a 0,01 secondi.

Aumentare il timeout può rallentare il caricamento del mio sito?

Sì, se il timeout viene applicato in modo globale a chiamate che avvengono durante il rendering della pagina frontend. Per questa ragione è sempre consigliabile filtrare per URL o eseguire chiamate asincrone in background.

Questo filtro risolve tutti i tipi di errore cURL?

No, risolve specificamente l’errore cURL 28 legato all’esaurimento del tempo limite (Operation timed out). Non corregge errori di certificato SSL non valido, porte bloccate o indirizzi URL errati.

Articoli simili