web-dev-qa-db-fra.com

L'erreur a expiré avec succès wp_remote_post

Ce que j'essaie de faire: Transmettre les données POST à l'aide 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
    }
}

Je travaille avec plus de 20 messages par appel. Chaque fois que la boucle se termine, je reçois ce message d'erreur:

"L'opération a expiré après 5001 millisecondes avec 0 octet reçu"

La chose étrange est que les données sont réellement reçues et stockées avec succès sur le serveur désigné $url.

Quelqu'un peut-il m'indiquer la bonne direction, où devrais-je chercher pour éviter de recevoir ce message d'erreur?

Référence: wp_remote_post

3
Nich

Après avoir laissé le message d'erreur boguer mon écran, j'ai trouvé un moyen de résoudre ce problème.

Oui, c'est un problème de délai d'attente, et le codex ne m'a pas beaucoup aidé. J'ai donc essayé une autre approche, en définissant un filtre;

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

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

J'espère que cela pourrait être une autre référence pour quelqu'un d'autre à l'avenir.

6
Nich

Vous pouvez définir le délai directement dans le wp_remote_post()$args, conformément à cet exemple 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>';
}

Une autre chose à noter: dans cet exemple, le délai d'attente est de 45 secondes, mais dans de nombreux cas, cela dépassera la limite de temps PHP max_execution_time; vous aurez donc toujours une erreur, mais cette fois, un erreur fatale PHP (500) plutôt que l'erreur http renvoyée par WordPress (vous êtes donc bien pire!).

Cela peut être résolu en définissant max_execution_time dans votre php.ini, ou, si vous n'exécutez pas dans safe_mode (peu probable sur un serveur de production), vous pouvez essayer de le définir par programme dans votre code, comme dans l'exemple ci-dessous:

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

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

Ici, je règle le délai d'attente PHP à 10 secondes de plus que le délai d'attente HTTP, juste pour être sûr.

En outre, il serait préférable de réinitialiser ensuite le délai d’attente, ce qui correspond probablement à la valeur renvoyée par ini_get( 'max_execution_time' );.

7
Tom Auger