WordPress.org

Make WordPress Core

Ticket #18738: 18738-curl_multi.patch

File 18738-curl_multi.patch, 1.8 KB (added by kurtpayne, 6 years ago)

Use curl_multi functions for non-blocking requests

  • wp-includes/class-http.php

     
    10221022        private $headers = '';
    10231023
    10241024        /**
     1025         * Curl multi resource handle
     1026         * @var mixed
     1027         */
     1028        public $curl_multi = null;
     1029       
     1030        /**
     1031         * List of curl handles
     1032         * @var array
     1033         */
     1034        private $curl_handles = array();
     1035
     1036        /**
    10251037         * Send a HTTP request to a URI using cURL extension.
    10261038         *
    10271039         * @access public
     
    11461158
    11471159                // We don't need to return the body, so don't. Just execute request and return.
    11481160                if ( ! $r['blocking'] ) {
    1149                         curl_exec( $handle );
    1150                         curl_close( $handle );
     1161                        $this->curl_handles[] = $handle;
     1162                        $this->curl_multi = curl_multi_init();
     1163                        curl_multi_add_handle( $this->curl_multi, $handle );
     1164                        curl_multi_exec( $this->curl_multi, $active );
     1165                        add_action( 'shutdown', array( $this, 'close_connections' ) );
    11511166                        return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() );
    11521167                }
    11531168
     
    12281243
    12291244                return apply_filters( 'use_curl_transport', true, $args );
    12301245        }
     1246       
     1247        /**
     1248         * Wait for any multi-requests to finish or time out and close the connection
     1249         */
     1250        public function close_connections() {
     1251                $mrc = $active = null;
     1252
     1253                // Make sure all of the requests have finished
     1254                // but don't listen for a response
     1255                do {
     1256                        $mrc = curl_multi_exec( $this->curl_multi, $active );
     1257                } while ( $active && $mrc == CURLM_CALL_MULTI_PERFORM );
     1258
     1259                // Close all handles, and the multi handle
     1260                foreach ( $this->curl_handles as $handle )
     1261                        curl_multi_remove_handle( $this->curl_multi, $handle );
     1262                curl_multi_close( $this->curl_multi );
     1263        }
    12311264}
    12321265
    12331266/**