sessions[] = curl_init( $url ); if( $opts != false ) { $key = count( $this->sessions ) - 1; $this->setOpts( $opts, $key ); } } /** * Sets an array of options to a cURL session * @param $options array, array of cURL options and values * @param $key int, session key to set option for */ public function setOpts( $options, $key = 0 ) { curl_setopt_array( $this->sessions[$key], $options ); } /** * Executes as cURL session * @param $key int, optional argument if you only want to execute one session */ public function exec( $key = false ) { $no = count( $this->sessions ); if( $no == 1 ) $res = $this->execSingleReturnArray(); elseif( $no > 1 ) { if( $key === false ) $res = $this->execMulti(); else $res = $this->execSingle( $key ); } if( $res ) return $res; } /** * Executes a stack of sessions * @return array of content if CURLOPT_RETURNTRANSFER is set */ public function execMulti() { $mh = curl_multi_init(); #Add all sessions to multi handle foreach ( $this->sessions as $i => $url ) curl_multi_add_handle( $mh, $this->sessions[$i] ); do $mrc = curl_multi_exec( $mh, $active ); while ( $mrc == CURLM_CALL_MULTI_PERFORM ); while ( $active && $mrc == CURLM_OK ) { if ( curl_multi_select( $mh ) != -1 ) { do $mrc = curl_multi_exec( $mh, $active ); while ( $mrc == CURLM_CALL_MULTI_PERFORM ); } } if ( $mrc != CURLM_OK ) echo "Curl multi read error $mrc\n"; #Get content foreach session, retry if applied foreach ( $this->sessions as $i => $url ) { $urlVero = $this->info( $i, CURLINFO_EFFECTIVE_URL ); $code = $this->info( $i, CURLINFO_HTTP_CODE ); if( $code[0] > 0 && $code[0] < 400 ) { $res[] = curl_multi_getcontent( $this->sessions[$i] ); } else { //RETRY DISABLED $theError = $this->error($i); $res[] = serialize(array('error_code' => '408', 'error'=> 'TIMEOUT[HTTP CODE '.$code[0].']', 'error_details' => $theError[0].' >>> FOR THIS REQUEST >>> '. $urlVero[0])); //$res[] = false; } curl_multi_remove_handle( $mh, $this->sessions[$i] ); } curl_multi_close( $mh ); return $res; } /** * Closes cURL sessions * @param $key int, optional session to close */ public function close( $key = false ) { if( $key === false ) { foreach( $this->sessions as $session ) curl_close( $session ); } else curl_close( $this->sessions[$key] ); } /** * Remove all cURL sessions */ public function clear() { foreach( $this->sessions as $session ) curl_close( $session ); unset( $this->sessions ); } /** * Returns an array of session information * @param $key int, optional session key to return info on * @param $opt constant, optional option to return */ public function info( $key = false, $opt = false ) { if( $key === false ) { foreach( $this->sessions as $key => $session ) { if( $opt ) $info[] = curl_getinfo( $this->sessions[$key], $opt ); else $info[] = curl_getinfo( $this->sessions[$key] ); } } else { if( $opt ) $info[] = curl_getinfo( $this->sessions[$key], $opt ); else $info[] = curl_getinfo( $this->sessions[$key] ); } return $info; } /** * Returns an array of errors * @param $key int, optional session key to retun error on * @return array of error messages */ public function error( $key = false ) { if( $key === false ) { foreach( $this->sessions as $session ) $errors[] = curl_error( $session ); } else $errors[] = curl_error( $this->sessions[$key] ); return $errors; } /** * Returns an array of session error numbers * @param $key int, optional session key to retun error on * @return array of error codes */ public function errorNo( $key = false ) { if( $key === false ) { foreach( $this->sessions as $session ) $errors[] = curl_errno( $session ); } else $errors[] = curl_errno( $this->sessions[$key] ); return $errors; } } ?>