Error de SimplePie – Curl Timeout en WordPress

3 minutos de lectura

avatar de usuario de ant-C
hormiga-c

me sale el error WP HTTP Error: cURL error 28: Operation timed out after 1001 milliseconds with 0 bytes received utilizando el fetch_feed() método en mi complemento de WordPress.

Esto es para tratar de obtener una fuente RSS más grande y necesito aumentar el tiempo de espera de Curl. ¿No estoy seguro de por qué está configurado en 1 segundo en lugar de 5 también?

La documentación de WP sobre esto no es muy detallada. WP_Feed_Cache en particular que SimplePie_Cache la documentación de la clase no está presente.

Cualquier ayuda sería apreciada, no estoy seguro si puedo conectarme a SimplePie para aumentar el tiempo de espera de Curl. Además, traté de reescribir mi propio fetch_feed() método sin éxito a continuación:

    public function fetchFeed( $url ) {
    if( ! class_exists('\SimplePie', false) ) {
        require_once( ABSPATH . WPINC . '/class-simplepie.php' );
    }

    require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' );
    require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' );
    require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' );
    require_once( ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php' );

    $feed = new \SimplePie();

    $feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' );
    // We must manually overwrite $feed->sanitize because SimplePie's
    // constructor sets it before we have a chance to set the sanitization class
    $feed->sanitize = new \WP_SimplePie_Sanitize_KSES();


    /* Customize sanitization */
    $feed->sanitize->enable_cache = false;
    $feed->sanitize->timeout = 60;
    $feed->sanitize->useragent = "Custom Testing Feed Reader";

    $feed->set_cache_class( 'WP_Feed_Cache' );
    $feed->set_file_class( 'WP_SimplePie_File' );

    $feed->set_feed_url( $url );
    $feed->set_timeout( 30 );
    /** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */
    $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 60, $url ) ); //changing cache time to 60 seconds (instead of 12 hours)
    /**
     * Fires just before processing the SimplePie feed object.
     *
     * @since 3.0.0
     *
     * @param object $feed SimplePie feed object (passed by reference).
     * @param mixed  $url  URL of feed to retrieve. If an array of URLs, the feeds are merged.
     */
    do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) );
    $feed->init();
    // $feed->set_output_encoding( get_option( 'blog_charset' ) );
    $feed->set_output_encoding( "UTF-8" ); //set statically to UTF-8

    if ( $feed->error() )
        return new \WP_Error( 'simplepie-error', $feed->error() );

    return $feed;
}

Pude aumentar el Curl Timeout usando el siguiente código:

//Set HTTP Request Timeout
add_filter('http_request_args', 'my_http_request_args', 100, 1);
function my_http_request_args( $r ) {
    $r['timeout'] = 30;
    return $r;
}

//Setting WP HTTP API Timeout
add_action('http_api_curl', 'my_http_api_curl', 100, 1);
function my_http_api_curl( $handle ) {
    curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt( $handle, CURLOPT_TIMEOUT, 30 );
}

// Setting custom timeout for the HTTP request
add_filter('http_request_timeout', 'my_custom_http_request_timeout', 101 );
function my_custom_http_request_timeout( $timeLimit ) {
    return 30;
}

  • Gracias por esto. ¡Muy molesto que no haya un filtro incorporado que simplemente cambie el tiempo de espera global! Para cualquier otra persona que se pregunte, debe copiar todo esto para que funcione, parece que hay múltiples tiempos de espera en WP y si no los filtra todos, termina con uno de ellos tomando el control y limitándolo a 15S.

    – chaleco

    28 abr a las 22:33

  • También tenga en cuenta que esto aumentará el tiempo de espera en TODAS LAS SOLICITUDES HTTP, no solo en SimplePie. Eso significa que cualquier complemento que busque una actualización podría hacer que su sitio sea MUCHO más lento, ¡así que tenga cuidado! ¡Nadie debería usar esto en producción! Lo necesitaba para algunas pruebas de aceptación que a veces se agotaban.

    – chaleco

    28 abr a las 22:37

¿Ha sido útil esta solución?