Время ожидания ошибки истекло при успешной удаленной публикации wp
Что я пытаюсь сделать: Передача почтовых данных с помощью 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
}
}
Я работаю с более чем 20 сообщениями за звонок. Каждый раз, когда цикл завершается, я получаю это сообщение об ошибке:
"Время ожидания операции истекло через 5001 миллисекунду при получении 0 байтов"
Странно то, что данные фактически получены и успешно сохранены на указанном сервере $url
.
Может ли кто-нибудь указать мне правильное направление, где я должен хотите избежать получения этого сообщения об ошибке?
Ссылка: сообщение wp_remote_post
2 answers
Спустя довольно долгое время, когда сообщение об ошибке появилось на моем экране, я нашел способ решить эту проблему.
Да, это проблема с тайм-аутом, и кодекс мне не очень помог. Поэтому я попробовал другой подход, установив фильтр;
add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );
function wp9838c_timeout_extend( $time )
{
// Default timeout is 5
return 10;
}
Я надеюсь, что это может стать еще одной ссылкой для кого-то еще в будущем.
Вы можете установить время ожидания непосредственно в wp_remote_post()
$args
, в соответствии с этим примером из 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>';
}
Еще одно замечание: в этом примере время ожидания составляет 45 секунд, но во многих случаях это превысит ограничение по времени PHP max_execution_time
, поэтому вы все равно получите ошибку, но на этот раз фатальная ошибка PHP (500), а не ошибка http, возвращенная WordPress (так что вам на самом деле хуже!).
Это можно решить, установив max_execution_time
в вашем php.ini, или, если вы не работаете в safe_mode
(маловероятно на рабочем сервере), вы можете попытаться установить его программно в своем коде, как показано в примере ниже:
$timeout = 45;
if ( ! ini_get( 'safe_mode' ) ){
set_time_limit( $timeout + 10 );
}
$response = wp_remote_post( $url, array(
'timeout' => $timeout
) );
Здесь я установил тайм-аут PHP на 10 секунд больше, чем тайм-аут HTTP, просто на всякий случай.
Кроме того, было бы лучше всего затем сбросить тайм-аут до того, каким он был, что, вероятно, является значением, возвращаемым ini_get( 'max_execution_time' );