Error de tiempo de espera con éxito wp_remote_post

2

Lo que estoy tratando de hacer: Pasar datos POST mediante el uso de 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 {
        // the rest of my code here
    }
}

Estoy trabajando con más de 20 publicaciones por llamada. Cada vez que finaliza el bucle, aparece este mensaje de error:

  

"La operación se agotó después de 5001 milisegundos con 0 bytes recibidos"

Lo extraño es que los datos se reciben y se almacenan correctamente en el servidor $url designado.

¿Alguien puede indicarme la dirección correcta? ¿Dónde debería mirar para evitar recibir ese mensaje de error?

Referencia: wp_remote_post

    
pregunta Nich 11.07.2014 - 07:15

2 respuestas

6

Después de bastante tiempo dejando que el mensaje de error afectara mi pantalla, encontré una manera de resolver esto.

Sí, es un problema de tiempo de espera, y el códice no me ayudó mucho. Así que intenté otro enfoque, estableciendo un filtro;

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

function wp9838c_timeout_extend( $time )
{
    // Default timeout is 5
    return 10;
}

Espero que esta sea otra referencia para otra persona en el futuro.

    
respondido por el Nich 30.10.2014 - 07:09
5

Puede establecer el tiempo de espera directamente en wp_remote_post() $args , según 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 "Something went wrong: $error_message";
} else {
    echo 'Response:<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, se superará el límite de tiempo de PHP max_execution_time , por lo que aún obtendrá un error, pero esta vez, es fatal. Error de PHP (500) en lugar del error de http devuelto por WordPress (¡así que en realidad estás peor!).

Esto se puede resolver configurando max_execution_time en su php.ini, o, si no está ejecutando en safe_mode (poco probable en un servidor de producción), puede intentar establecerlo programáticamente dentro de su código, como por el siguiente ejemplo:

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

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

Aquí, configuro el tiempo de espera de PHP en 10 segundos más que el tiempo de espera de HTTP, solo para estar seguro.

Además, sería una buena práctica restablecer el tiempo de espera de nuevo a lo que era, que es probablemente el valor devuelto por ini_get( 'max_execution_time' );

    
respondido por el Tom Auger 16.05.2016 - 19:06

Lea otras preguntas en las etiquetas