Eroare de timeout cu wp_remote_post reușit
Ceea ce încerc să fac: Trimite date POST folosind wp_remote_post.
foreach ( $articles as $article_id ) {
$postarray = array(
'method' => 'POST',
'timeout' => 5, // Timeout setat la 5 secunde
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true, // Request blocant
'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; // Afișează mesajul de eroare
} else {
// restul codului meu aici
}
}
Lucrez cu peste 20 de articole per apel. De fiecare dată când bucla se termină, primesc acest mesaj de eroare:
"Operation timed out after 5001 milliseconds with 0 bytes received"
Lucrul ciudat este că datele sunt de fapt primite și stocate cu succes pe serverul destinație ($url
).
Poate cineva să mă îndrume în direcția corectă pentru a evita acest mesaj de eroare?
Referință: wp_remote_post

Puteți seta timeout-ul direct în argumentele $args
ale funcției wp_remote_post()
, conform acestui exemplu de pe 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 "Ceva nu a funcționat: $error_message";
} else {
echo 'Răspuns:<pre>';
print_r( $response );
echo '</pre>';
}
Un alt lucru de notat: în acest exemplu, timeout-ul este setat la 45 de secunde, dar în multe cazuri, această valoare va depăși limita max_execution_time
din PHP, așa că veți primi tot o eroare, dar de data aceasta o eroare fatală PHP (500) în loc de eroarea HTTP returnată de WordPress (deci situația este chiar mai gravă!).
Această problemă poate fi rezolvată prin setarea max_execution_time
în fișierul php.ini sau, dacă nu funcționați în modul safe_mode
(puțin probabil pe un server de producție), puteți încerca să o setați programatic în cod, conform exemplului de mai jos:
$timeout = 45;
if ( ! ini_get( 'safe_mode' ) ){
set_time_limit( $timeout + 10 );
}
$response = wp_remote_post( $url, array(
'timeout' => $timeout
) );
Aici, am setat timeout-ul PHP la 10 secunde peste timeout-ul HTTP, pentru a fi sigur.
De asemenea, ar fi o bună practică să resetați timeout-ul la valoarea inițială, care este probabil valoarea returnată de ini_get( 'max_execution_time' );

După ce am lăsat mesajul de eroare să-mi stea în fața ochilor ceva timp, am găsit o soluție pentru această problemă.
Da, este o problemă de timeout, iar codex-ul nu m-a ajutat prea mult. Așa că am încercat o altă abordare, prin setarea unui filtru:
add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );
function wp9838c_timeout_extend( $time )
{
// Timeout-ul implicit este 5
return 10;
}
Sper că această soluție va putea servi drept referință pentru alții în viitor.

Este întotdeauna minunat să găsești singur o soluție :-). Mulțumesc mult pentru postarea soluției tale. Doar nu uita să revii odată ce restricția a fost ridicată și să îți accepți propriul răspuns.
