- <?php
- /**
- * OO cURL Class
- * Object oriented wrapper for the cURL library.
- * @author David Hopkins (semlabs.co.uk)
- * @version 0.3
- */
- class CURL
- {
- public $sessions = array();
- public $retry = 0;
- /**
- * Adds a cURL session to stack
- * @param $url string, session's URL
- * @param $opts array, optional array of cURL options and values
- */
- public function addSession( $url, $opts = false )
- {
- $this->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;
- }
- }
- ?>