web-dev-qa-db-ja.com

Wp_remote_postが成功したため、エラーがタイムアウトしました

私がやろうとしていること: wp_remote_postを使用して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
    }
}

1回の通話につき20以上の投稿を処理しています。ループが終了するたびに、このエラーメッセージが表示されます。

"0バイトを受信した状態で5001ミリ秒後に操作がタイムアウトしました。"

奇妙なことに、データは実際に受信され、指定された$urlサーバーに正常に保存されます。

誰かが私を正しい方向に向けることができますか?そのエラーメッセージが出ないようにするにはどこを見ればいいですか?

参照先: wp_remote_post

3
Nich

私の画面にエラーメッセージが表示されてしばらくしてから、これを解決する方法を考え出しました。

はい、それはタイムアウトの問題です、そしてコーデックスは私をあまり助けませんでした。そこで私はフィルタを設定することによって別のアプローチを試みました。

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

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

私はこれが将来他の誰かにとって別の参考文献になることを願っています。

6
Nich

この例のように、 developer.wordpress.org :からタイムアウトを直接wp_remote_post()$argsに設定できます。

$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>';
}

もう1つ注意してください。この例では、タイムアウトは45秒ですが、多くの場合、それはPHP max_execution_timeの制限時間を超えるため、まだエラーが発生します。 WordPressから返されるhttpエラーではなく、致命的なPHP(500)エラーが発生します(実際にはさらに悪い結果になります)。

これはphp.iniでmax_execution_timeを設定することで解決できます。あるいは、safe_modeで実行していない場合(本番サーバーではそうではありません)、以下の例のようにコード内でプログラム的に設定を試みることができます。

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

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

ここでは、安全のため、PHPタイムアウトをHTTPタイムアウトより10秒長く設定しています。

また、タイムアウトを元の状態にリセットすることをお勧めします。これはおそらくini_get( 'max_execution_time' );によって返される値です。

7
Tom Auger