Время ожидания ошибки истекло при успешной удаленной публикации 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

Author: Nich, 2014-07-11

2 answers

Спустя довольно долгое время, когда сообщение об ошибке появилось на моем экране, я нашел способ решить эту проблему.

Да, это проблема с тайм-аутом, и кодекс мне не очень помог. Поэтому я попробовал другой подход, установив фильтр;

add_filter( 'http_request_timeout', 'wp9838c_timeout_extend' );

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

Я надеюсь, что это может стать еще одной ссылкой для кого-то еще в будущем.

 8
Author: Nich, 2014-10-30 06:09:55

Вы можете установить время ожидания непосредственно в 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' );

 8
Author: Tom Auger, 2016-05-16 17:06:11