Error de tiempo de espera con wp_remote_post exitoso
Lo que estoy intentando hacer: Enviar datos POST usando wp_remote_post.
foreach ( $articles as $article_id ) {
$postarray = array(
'method' => 'POST',
'timeout' => 5, // Tiempo de espera en segundos
'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 {
// el resto de mi código aquí
}
}
Estoy trabajando con 20+ artículos por llamada. Cada vez que termina el ciclo, obtengo este mensaje de error:
"Operation timed out after 5001 milliseconds with 0 bytes received"
Lo extraño es que los datos en realidad se reciben y almacenan correctamente en el servidor designado ($url
).
¿Alguien puede indicarme la dirección correcta, dónde debería buscar para evitar ese mensaje de error?
Referencia: wp_remote_post

Puedes establecer el tiempo de espera directamente en los $args
de wp_remote_post()
, como en este ejemplo de 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 "Algo salió mal: $error_message";
} else {
echo 'Respuesta:<pre>';
print_r( $response );
echo '</pre>';
}
Otra cosa a tener en cuenta: en este ejemplo, el tiempo de espera es de 45 segundos, pero en muchos casos, eso excederá el límite de tiempo max_execution_time
de PHP, por lo que aún obtendrás un error, pero esta vez, un error fatal de PHP (500) en lugar del error HTTP devuelto por WordPress (¡así que en realidad estás peor!).
Esto se puede solucionar configurando max_execution_time
en tu php.ini o, si no estás ejecutando en safe_mode
(poco probable en un servidor de producción), puedes intentar establecerlo programáticamente dentro de tu código, como en el ejemplo a continuación:
$timeout = 45;
if ( ! ini_get( 'safe_mode' ) ){
set_time_limit( $timeout + 10 );
}
$response = wp_remote_post( $url, array(
'timeout' => $timeout
) );
Aquí, establezco el tiempo de espera de PHP en 10 segundos más que el tiempo de espera HTTP, solo para estar seguro.
Además, sería una buena práctica restablecer el tiempo de espera a su valor original, que probablemente sea el valor devuelto por ini_get( 'max_execution_time' );

Después de bastante tiempo con el mensaje de error molestando en mi pantalla, encontré una forma de solucionarlo.
Sí, es un problema de tiempo de espera, y el codex no me ayudó mucho. Así que probé otro enfoque, estableciendo un filtro:
add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );
function wp9838c_timeout_extend( $time )
{
// El tiempo de espera predeterminado es 5
return 10;
}
Espero que esto pueda servir como referencia para alguien más en el futuro.

Siempre es genial cuando encuentras una solución por ti mismo :-). Muchas gracias por compartir tu solución. Solo recuerda volver una vez que se levanten las restricciones y aceptar tu propia respuesta.
