Most cURL wrapper classes I found could handle either the PHP extension or the command line executable version of cURL. I needed a class where I could set one variable and have it switch from using the PHP cURL extension to the cURL executable without having to change the other variable of the class.
The class I came up with is below:
001 |
class Curl { |
002 |
003 |
// Set to "PHP" or the path to the curl executable (binary) |
004 |
var $curlExecutable = "PHP" ; |
005 |
006 |
// URL to request, request type (GET or POST), request parameters as an associative array or null for none |
007 |
var $url ; |
008 |
var $requestType = "GET" ; |
009 |
var $parameters = null; |
010 |
011 |
// request headers as an array |
012 |
var $requestHeaders = array (); |
013 |
014 |
// certification authority, return data with headers, follow redirects and verify peer if URL is https |
015 |
var $cainfo = null; |
016 |
var $outputWithHeaders = false; |
017 |
var $followLocation = false; |
018 |
var $SSLVerifyPeer = true; |
019 |
020 |
// connect to remote server timeout and timeout to download the entire page |
021 |
var $connectTimeout = 30; |
022 |
var $timeout = 10800; |
023 |
024 |
// if there was an error, errorNumber and error is populated. data contains the page downloaded |
025 |
var $error = null; |
026 |
var $errorNumber = null; |
027 |
var $data = null; |
028 |
029 |
function fetchPage() { |
030 |
031 |
if ( $this ->curlExecutable == "PHP" ) { |
032 |
$ch = curl_init(); |
033 |
034 |
if ( $this ->cainfo) { |
035 |
curl_setopt( $ch , CURLOPT_CAINFO, $this ->cainfo); |
036 |
} |
037 |
038 |
if ( $this ->SSLVerifyPeer) { |
039 |
curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, true); |
040 |
} else { |
041 |
curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false); |
042 |
} |
043 |
044 |
if ( $this ->requestType === "POST" ) { |
045 |
curl_setopt( $ch , CURLOPT_POST, 1); |
046 |
047 |
if ( $this ->parameters) { |
048 |
if ( is_array ( $this ->parameters)) { |
049 |
050 |
$encodedParameters = "" ; |
051 |
$join = "" ; |
052 |
053 |
foreach ( $this ->parameters as $name => $value ) { |
054 |
$encodedParameters = $encodedParameters . $join . rawurlencode( $name ) . "=" . rawurlencode( $value ); |
055 |
$join = "&" ; |
056 |
} |
057 |
058 |
curl_setopt( $ch , CURLOPT_POSTFIELDS, $encodedParameters ); |
059 |
060 |
} elseif ( is_string ( $this ->parameters)) { |
061 |
062 |
curl_setopt( $ch , CURLOPT_POSTFIELDS, $this ->parameters); |
063 |
064 |
} |
065 |
} |
066 |
067 |
} else { |
068 |
curl_setopt( $ch , CURLOPT_POST, 0); |
069 |
070 |
if ( $this ->parameters) { |
071 |
$encodedParameters = "" ; |
072 |
$join = "?" ; |
073 |
074 |
foreach ( $this ->parameters as $name => $value ) { |
075 |
$encodedParameters = $encodedParameters . $join . rawurlencode( $name ) . "=" . rawurlencode( $value ); |
076 |
$join = "&" ; |
077 |
} |
078 |
079 |
$this ->url = $this ->url . $encodedParameters ; |
080 |
} |
081 |
082 |
} |
083 |
084 |
curl_setopt( $ch , CURLOPT_HTTPHEADER, $this ->requestHeaders); |
085 |
086 |
if ( $this ->outputWithHeaders) { |
087 |
curl_setopt( $ch , CURLOPT_HEADER, 1); |
088 |
} else { |
089 |
curl_setopt( $ch , CURLOPT_HEADER, 0); |
090 |
} |
091 |
092 |
if ( $this ->followLocation) { |
093 |
curl_setopt( $ch , CURLOPT_FOLLOWLOCATION, 1); |
094 |
} else { |
095 |
curl_setopt( $ch , CURLOPT_FOLLOWLOCATION, 0); |
096 |
} |
097 |
098 |
curl_setopt( $ch , CURLOPT_URL, $this ->url); |
099 |
curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); |
100 |
101 |
curl_setopt( $ch , CURLOPT_CONNECTTIMEOUT, $this ->connectTimeout); |
102 |
curl_setopt( $ch , CURLOPT_TIMEOUT, $this ->timeout); |
103 |
104 |
$this ->data = curl_exec( $ch ); |
105 |
$this ->error = curl_error( $ch ); |
106 |
$this ->errorNumber = curl_errno( $ch ); |
107 |
curl_close( $ch ); |
108 |
109 |
if ( $this ->error) { |
110 |
return false; |
111 |
} else { |
112 |
return true; |
113 |
} |
114 |
115 |
} else { |
116 |
117 |
$command = $this ->executable; |
118 |
119 |
$command = $command . " -s -S" ; |
120 |
121 |
$command = $command . " --connect-timeout " . $this ->connectTimeout; |
122 |
$command = $command . " --max-time " . $this ->timeout; |
123 |
124 |
if ( $this ->cainfo) { |
125 |
$command = $command . " --cacert " " . $this->cainfo . " "" ; |
126 |
} |
127 |
128 |
if ( $this ->outputWithHeaders) { |
129 |
$command = $command . " -i" ; |
130 |
} |
131 |
132 |
if ( $this ->followLocation) { |
133 |
$command = $command . " -L" ; |
134 |
} |
135 |
136 |
for ( $i = 0; $i < count ( $this ->requestHeaders); $i ++) { |
137 |
$command = $command . " -H " " . $this->requestHeaders[$i] . " "" ; |
138 |
} |
139 |
140 |
if ( $this ->parameters){ |
141 |
$encodedParameters = "" ; |
142 |
$join = "" ; |
143 |
144 |
foreach ( $this ->parameters as $name => $value ) { |
145 |
$encodedParameters = $encodedParameters . $join . rawurlencode( $name ) . "=" . rawurlencode( $value ); |
146 |
$join = "&" ; |
147 |
} |
148 |
149 |
$command = $command . " -d " . escapeshellarg ( $encodedParameters ) . "" ; |
150 |
} |
151 |
152 |
if ( $this ->requestType === "GET" ) { |
153 |
$command = $command . " -G" ; |
154 |
} |
155 |
156 |
$command = $command . " " . $this ->url; |
157 |
158 |
$descriptorspec = array ( |
159 |
0 => array ( "pipe" , "r" ), |
160 |
1 => array ( "pipe" , "w" ), |
161 |
2 => array ( "pipe" , "w" ) |
162 |
); |
163 |
164 |
$process = proc_open( $command , $descriptorspec , $pipes ); |
165 |
166 |
if ( is_resource ( $process )) { |
167 |
168 |
fclose( $pipes [0]); // close stdin as we are not going to supply any input |
169 |
170 |
$this ->data = stream_get_contents( $pipes [1]); // read stdout |
171 |
$this ->error = stream_get_contents( $pipes [2]); // read stderr |
172 |
173 |
fclose( $pipes [1]); |
174 |
fclose( $pipes [2]); |
175 |
176 |
$this ->errorNumber = proc_close( $process ); |
177 |
178 |
} else { |
179 |
180 |
return false; |
181 |
182 |
} |
183 |
184 |
if ( $this ->errorNumber === 0) { |
185 |
return true; |
186 |
} else { |
187 |
return false; |
188 |
} |
189 |
190 |
} |
191 |
192 |
} |
193 |
194 |
} |
The following example fetches http://www.google.com :
01 |
$request = new Curl; |
02 |
$request ->curlExecutable = "PHP" ; |
03 |
$request ->followLocation = true; |
04 |
$request ->url = "http://www.google.com" ; |
05 |
if ( $request ->fetchPage() ) { |
06 |
header( "Content-Type:text/plain" ); |
07 |
echo $request ->data; |
08 |
} else { |
09 |
echo "An error occured: " . $request ->errorNumber . " - " . $request ->error; |
10 |
} |
This example fetches a random quote (the ones you see on the top right of this website):
01 |
$request = new Curl; |
02 |
$request ->curlExecutable = "PHP" ; |
03 |
$request ->url = "http://www.ankur.com/quotes.php" ; |
04 |
$request ->requestType = "GET" ; |
05 |
$request ->parameters = array ( |
06 |
"action" => "random" |
07 |
); |
08 |
if ( $request ->fetchPage() ) { |
09 |
header( "Content-Type:text/plain" ); |
10 |
echo $request ->data; |
11 |
} else { |
12 |
echo "An error occured: " . $request ->errorNumber . " - " . $request ->error; |
13 |
} |
Unrelated to the cURL wrapper class, you can try changing the action parameter from random to all to fetch all the quotes.
Related posts: