Errore di timeout con wp_remote_post nonostante l'invio avvenuto con successo

11 lug 2014, 08:15:50
Visualizzazioni: 19.2K
Voti: 7

Cosa sto cercando di fare: Invio dati POST utilizzando wp_remote_post.

foreach ( $articles as $article_id ) {
    $postarray = array(
    'method'        => 'POST',
    'timeout'       => 5,
    'redirection'   => 5,
    'httpversion'   => '1.0',
    'blocking'      => true,
    'headers'       => array(),
    'body'          => array(
        'article_id' => $article_id
        ),
    'cookies' => array()
    );

    $response = wp_remote_post($url, $postarray);

    if ( is_wp_error($response) ) {
        $error_message = $response->get_error_message();
        echo $error_message;
    } else {
        // il resto del mio codice qui
    }
}

Sto lavorando con più di 20 articoli per chiamata. Ogni volta che il ciclo termina, ottengo questo messaggio di errore:

"Operazione scaduta dopo 5001 millisecondi con 0 byte ricevuti"

La cosa strana è che i dati vengono effettivamente ricevuti e memorizzati con successo sul server $url di destinazione.

Qualcuno può indicarmi la direzione giusta, dove dovrei cercare per evitare questo messaggio di errore?

Riferimento: wp_remote_post

0
Tutte le risposte alla domanda 2
1
13

Puoi impostare il timeout direttamente negli $args di wp_remote_post(), come in questo esempio da developer.wordpress.org:

$response = wp_remote_post( $url, array(
    'method'      => 'POST',
    'timeout'     => 45,
    'redirection' => 5,
    'httpversion' => '1.0',
    'blocking'    => true,
    'headers'     => array(),
    'body'        => array(
        'username' => 'bob',
        'password' => '1234xyz'
    ),
    'cookies'     => array()
    )
);

if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Si è verificato un errore: $error_message";
} else {
    echo 'Risposta:<pre>';
    print_r( $response );
    echo '</pre>';
}

Un'altra cosa da notare: in questo esempio, il timeout è di 45 secondi, ma in molti casi, questo supererà il limite di tempo max_execution_time di PHP, quindi otterrai comunque un errore, ma questa volta sarà un errore fatale PHP (500) anziché l'errore http restituito da WordPress (quindi sei in una situazione peggiore!).

Questo può essere risolto impostando max_execution_time nel tuo php.ini, oppure, se non sei in modalità safe_mode (improbabile su un server di produzione), puoi provare a impostarlo a livello di codice, come nell'esempio seguente:

$timeout = 45;
if ( ! ini_get( 'safe_mode' ) ){
    set_time_limit( $timeout + 10 );
}

$response = wp_remote_post( $url, array(
    'timeout' => $timeout
) );

Qui, ho impostato il timeout di PHP a 10 secondi in più rispetto al timeout HTTP, per sicurezza.

Inoltre, sarebbe una best practice ripristinare il timeout al valore originale, che probabilmente è quello restituito da ini_get( 'max_execution_time' );

16 mag 2016 20:06:11
Commenti

Domanda, riguardo al max_execution_time, sai qual è il valore predefinito per WordPress? O meglio, dove potrei trovare questa impostazione?

wlh wlh
29 gen 2019 17:43:49
2

Dopo un bel po' di tempo a lasciare che il messaggio di errore disturbasse il mio schermo, ho trovato un modo per risolvere il problema.

Sì, è un problema di timeout, e il codex non mi è stato di grande aiuto. Quindi ho provato un altro approccio, impostando un filtro:

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

function wp9838c_timeout_extend( $time )
{
    // Il timeout predefinito è 5
    return 10;
}

Spero che questo possa essere un riferimento utile per qualcun altro in futuro.

30 ott 2014 08:09:55
Commenti

È sempre fantastico quando trovi una soluzione da solo :-). Grazie mille per aver condiviso la tua soluzione. Ricordati solo di tornare una volta che le restrizioni saranno state rimosse e accettare la tua risposta.

Pieter Goosen Pieter Goosen
30 ott 2014 08:15:45

Sono tornato immediatamente dopo aver ricevuto la notifica via email. Grazie per la tua guida, @PieterGoosen

Nich Nich
30 ott 2014 14:08:13