it should be noted that when using CURLOPT_POSTFIELDS in a loop, CURLOPT_POSTFIELDS appends to the sting. You can use unset() if you don't want this sort of behavior.
<?php
//this will append postfields
while(true) {
$options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
$ch = curl_init("http://www.example.com");
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
}
//this will NOT append postfields
while(true) {
$options = array(CURLOPT_POSTFIELDS => 'foo=bar&foo2=bar');
$ch = curl_init("http://www.example.com");
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
unset($options[CURLOPT_POSTFIELDS]);
}
?>
curl_setopt_array
(PHP 5 >= 5.1.3)
curl_setopt_array — Устанавливает несколько параметров для сеанса cURL
Описание
$ch
, array $options
)Устанавливает несколько параметров для сеанса cURL. Эта функция полезна при установке большого количества cURL-параметров без необходимости постоянно вызывать curl_setopt().
Список параметров
-
ch -
Дескриптор cURL, полученный из curl_init().
-
options -
Массив (array), определяющий устанавливаемые параметры и их значения. Ключи должны быть корректными константами для функции curl_setopt() или их целочисленными эквивалентами.
Возвращаемые значения
Возвращает TRUE, если все параметры были успешно установлены.
Если не удалось успешно установить какой-либо параметр,
немедленно возвращается значение FALSE, а последующие параметры
в массиве options будут проигнорированы.
Примеры
Пример #1 Инициализация новой сессии cURL и загрузка веб-страницы
<?php
// создание нового ресурса cURL
$ch = curl_init();
// установка set URL и других соответствующих параметров
$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => false
);
curl_setopt_array($ch, $options);
// загрузка URL и ее выдача в браузер
curl_exec($ch);
// закрытие ресурса cURL и освобождение системных ресурсов
curl_close($ch);
?>
До версии PHP 5.1.3 вместо этой функции можно было использовать следующий код:
Пример #2 Наша собственная реализация curl_setopt_array()
<?php
if (!function_exists('curl_setopt_array')) {
function curl_setopt_array(&$ch, $curl_options)
{
foreach ($curl_options as $option => $value) {
if (!curl_setopt($ch, $option, $value)) {
return false;
}
}
return true;
}
}
?>
Примечания
Замечание:
Как и при работе с curl_setopt(), передача массива в параметр
CURLOPT_POSTзакодирует все данные с помощью multipart/form-data, тогда как передача URL-кодированной строки будет использовать кодировку application/x-www-form-urlencoded.
Starting in PHP 5.2.0, CURLOPT_FOLLOWLOCATION can't be set via curl_setopt_array() (or curl_setopt()) when either safe_mode is enabled or open_basedir is set. In these cases, the order of CURLOPT_* settings in the array can be important.
In case that you need to read SSL page content from https with curl, this function can help you:
<?php
function get_web_page( $url,$curl_data )
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_POST => 1, // i am sending post data
CURLOPT_POSTFIELDS => $curl_data, // this are my post vars
CURLOPT_SSL_VERIFYHOST => 0, // don't verify ssl
CURLOPT_SSL_VERIFYPEER => false, //
CURLOPT_VERBOSE => 1 //
);
$ch = curl_init($url);
curl_setopt_array($ch,$options);
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch) ;
$header = curl_getinfo($ch);
curl_close($ch);
// $header['errno'] = $err;
// $header['errmsg'] = $errmsg;
// $header['content'] = $content;
return $header;
}
$curl_data = "var1=60&var2=test";
$url = "https://www.example.com";
$response = get_web_page($url,$curl_data);
print '<pre>';
print_r($response);
?>
There is no CURLOPT_MAXFILESIZE in the PHP module but it's function only works with Content-Length headers anyway. There are two ways of checking download sizes, one is after the download is complete using filesize(), the other is as the download is running allowing you to terminate before wasting time and disk space.
<?php
$GLOBALS['file_size'] = 0;
$GLOBALS['max_file_size'] = 1024 * 1024;
function on_curl_header($ch, $header)
{
$trimmed = rtrim($header);
if (preg_match('/^Content-Length: (\d+)$/', $trimmed, $matches))
{
$file_size = $matches[1];
if ($file_size > $GLOBALS['max_file_size']) {
// handle error here.
}
}
return strlen($header);
}
function on_curl_write($ch, $data)
{
$bytes = strlen($data);
$GLOBALS['file_size'] += $bytes;
if ($GLOBALS['file_size'] > $GLOBALS['max_file_size']) {
// handle error here.
}
return $bytes;
}
$ch = curl_init();
$options = array(CURLOPT_URL => 'http://www.php.net/',
CURLOPT_HEADER => false,
CURLOPT_HEADERFUNCTION => 'on_curl_header',
CURLOPT_WRITEFUNCTION => 'on_curl_write');
curl_setopt_array($ch, $options);
curl_exec($ch);
// ...
?>
You can use CURLOPT_HEADERFUNCTION with a callback inside an object. This makes is it easy to capture the headers for later use. For example:
<?php
class Test
{
public $headers;
//...
public function exec($opts)
{
$this->headers = array();
$opts[CURLOPT_HEADERFUNCTION] = array($this, '_setHeader');
$ch = curl_init();
curl_setopt_array($ch, $opts);
return curl_exec($ch);
}
private function _setHeader($ch, $header)
{
$this->headers[] = $header;
return strlen($header);
}
}
$test = new Test();
$opts = array(
//... your curl opts here
);
$data = $test->exec($opts);
print_r($test->headers);
?>
...something like that
(This works in php v. 5.1.4)
