sessions[] = curl_init( $url ); if( $opts != false ) { $key = count( $this->sessions ) - 1; $this->setOpts( $opts, $key ); } } /** * Sets an option to a cURL session * @param $option constant, cURL option * @param $value mixed, value of option * @param $key int, session key to set option for */ public function setOpt( $option, $value, $key = 0 ) { curl_setopt( $this->sessions[$key], $option, $value ); } /** * 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->execSingle(); elseif( $no > 1 ) { if( $key === false ) $res = $this->execMulti(); else $res = $this->execSingle( $key ); } if( $res ) return $res; } /** * Executes a single cURL session * @param $key int, id of session to execute * @return array of content if CURLOPT_RETURNTRANSFER is set */ public function execSingle( $key = 0 ) { if( $this->retry > 0 ) { $retry = $this->retry; $code = 0; while( $retry >= 0 && ( $code[0] == 0 || $code[0] >= 400 ) ) { $res = curl_exec( $this->sessions[$key] ); $code = $this->info( $key, CURLINFO_HTTP_CODE ); $retry--; } } else $res = curl_exec( $this->sessions[$key] ); 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 ) { $code = $this->info( $i, CURLINFO_HTTP_CODE ); if( $code[0] > 0 && $code[0] < 400 ) $res[] = curl_multi_getcontent( $this->sessions[$i] ); else { if( $this->retry > 0 ) { $retry = $this->retry; $this->retry -= 1; $eRes = $this->execSingle( $i ); if( $eRes ) $res[] = $eRes; else $res[] = false; $this->retry = $retry; echo '1'; } else $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; } } ?>