Errore di timeout con wp_remote_post nonostante l'invio avvenuto con successo
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

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' );

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.

È 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.
