私がやろうとしていること: 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
私の画面にエラーメッセージが表示されてしばらくしてから、これを解決する方法を考え出しました。
はい、それはタイムアウトの問題です、そしてコーデックスは私をあまり助けませんでした。そこで私はフィルタを設定することによって別のアプローチを試みました。
add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );
function wp9838c_timeout_extend( $time )
{
// Default timeout is 5
return 10;
}
私はこれが将来他の誰かにとって別の参考文献になることを願っています。
この例のように、 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' );
によって返される値です。