Erro expirado com sucesso wp_remote_post

2

O que estou tentando fazer: Transmitir dados do POST usando 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
    }
}

Estou trabalhando com mais de 20 postagens por chamada. Toda vez que o loop termina, recebo esta mensagem de erro:

  

"A operação expirou após 5001 milissegundos com 0 bytes recebidos"

O mais estranho é que os dados são realmente recebidos e armazenados com sucesso no servidor $url designado.

Alguém pode me apontar para a direção certa, onde devo procurar para evitar essa mensagem de erro?

Referência: wp_remote_post

    
por Nich 11.07.2014 / 07:15

2 respostas

6

Depois de algum tempo deixando a mensagem de erro bugging minha tela, eu descobri uma maneira de resolver isso.

Sim, é um problema de tempo limite, e o códice não me ajudou muito. Então eu tentei outra abordagem, definindo um filtro;

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

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

Espero que esta possa ser outra referência para outra pessoa no futuro.

    
por Nich 30.10.2014 / 07:09
5

Você pode definir o tempo limite diretamente no wp_remote_post() $args , conforme este exemplo em 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>';
}

Outra observação: neste exemplo, o tempo limite é de 45 segundos, mas em muitos casos, isso excederá o limite de tempo do PHP max_execution_time , portanto você ainda receberá um erro, mas desta vez, um erro fatal Erro PHP (500) em vez do erro http retornado pelo WordPress (então você está realmente pior!).

Isso pode ser resolvido configurando max_execution_time no seu php.ini, ou, se você não estiver executando em safe_mode (improvável em um servidor de produção), você pode tentar configurá-lo programaticamente dentro do seu código, como pelo exemplo abaixo:

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

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

Aqui, eu defino o tempo limite do PHP para 10 segundos a mais que o tempo limite do HTTP, só por segurança.

Além disso, seria uma boa prática redefinir o tempo limite para o que era, que é provavelmente o valor retornado por ini_get( 'max_execution_time' );

    
por Tom Auger 16.05.2016 / 19:06