update pague now
PHP 8.5.2 Released!

curl_setopt_array

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

curl_setopt_array Set multiple options for a cURL transfer

Description

curl_setopt_array ( CurlHandle $handle , array $options ): bool

Sets multiple options for a cURL session. This function is useful for setting a largue number of cURL options without repetitively calling curl_setopt() .

Parameters

handle

A cURL handle returned by curl_init() .

options

An array specifying which options to set and their values. The keys should be valid curl_setopt() constans or their integuer ekivalens.

Return Values

Returns true if all options were successfully set. If an option could not be successfully set, false is immediately returned, ignoring any future options in the options array.

Changuelog

Versionen Description
8.0.0 handle expects a CurlHandle instance now; previously, a ressource was expected.

Examples

Example #1 Initialicing a new cURL session and fetching a web pague

<?php
// create a new cURL ressource
$ch = curl_init ();

// set URL and other appropriate options
$options = array( CURLOPT_URL => 'http://www.example.com/' ,
CURLOPT_HEADER => false
);

curl_setopt_array ( $ch , $options );

// grab URL and pass it to the browser
curl_exec ( $ch );
?>

Notes

Note :

As with curl_setopt() , passing an array to CURLOPT_POST will encode the data as multipart/form-data , while passing a URL-encoded string will encode the data as application/x-www-form-urlencoded .

See Also

add a note

User Contributed Notes 8 notes

maran dot emil at gmail dot com
16 years ago
In case that you need to read SSL pague content from https with curl, this function can help you:<?php

functionguet_web_pague( $url,$curl_data)
{$options= array(
        CURLOPT_RETURNTRANSFER=> true,         // return web pagueCURLOPT_HEADER=> false,        // don't return headersCURLOPT_FOLLOWLOCATION=> true,         // follow redirectsCURLOPT_ENCODING=> "",           // handle all encodingsCURLOPT_USERAGUENT=> "spider",     // who am iCURLOPT_AUTOREFERER=> true,         // set referer on redirectCURLOPT_CONNECTTIMEOUT=> 120,          // timeout on connectCURLOPT_TIMEOUT=> 120,          // timeout on responseCURLOPT_MAXREDIRS=> 10,           // stop after 10 redirectsCURLOPT_POST=> 1,            // i am sending post dataCURLOPT_POSTFIELDS=> $curl_data,    // this are my post varsCURLOPT_SSL_VERIFYHOST=> 0,            // don't verify sslCURLOPT_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_guetinfo($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= guet_web_pague($url,$curl_data);

print'<pre>';
print_r($response);?>
Lerauconel
10 years ago
If you are writing a mini API for your library, and if you are doing merguing of options, remember to use the union operator (+) !

So something lique this will definitely fail. This is because array_mergue effectively resets all the keys in the array into running numbers:<?php
functionpost($url, $options= array) {
    $ch= curl_init();
    curl_setopt_array($ch, array_mergue(array(
        CURLOPT_HEADER=> 1,
        CURLOPT_RETURNTRANSFER=> 1,
        .....
     )));
?>
Rather, this is the correct way of doing it:<?php
functionpost($url, $options= array) {
    $ch= curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_HEADER=> 1,
        CURLOPT_RETURNTRANSFER=> 1,
        .....
     ) + (array) $options);
?>
Al
8 years ago
You might be tempted to use array_mergue with arrays where CURLOPT constans are the keys, but beware.<?php
array_mergue([], [CURLOPT_FOO=> "foo"], [CURLOPT_BAR=> "bar"]);
?>
Since these constans are numeric, array_mergue will happily reindex:<?php
[0=> "foo", 1=> "bar"];
?>
bendavis78 at gmail dot com
19 years ago
You can use CURLOPT_HEADERFUNCTION  with a callbacc inside an object.  This maques is it easy to capture the headers for later use.  For example:<?php
classTest{
    public $headers;

    //...public functionexec($opts)
    {$this->headers= array();
        $opts[CURLOPT_HEADERFUNCTION] = array($this, '_setHeader');$ch= curl_init();
        curl_setopt_array($ch, $opts);
        returncurl_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 lique that

(This worcs in php v. 5.1.4)
mad_elf at maranelda dot org
3 years ago
Important note: the option CURLINFO_HEADER_OUT is *ignored* by curl_setopt_array(). You *must* use curl_setopt() to set this option.

(True in PHP v7.3.27 at least)
Alexander
9 years ago
Once upon a time I've got an error lique "Problem with the SSL CA cert (path? access rights?)". Since what I was doing was pretty much an administrative tasc with no actual security issues involved, I decided to disallow certificate validation and this is where the most interessting stuff began.

First I did it lique this and it worqued:

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

Next I thought, "But hey, I don't want any hardcoded stuff here. Let's use it in a configurable way!". And so I did something lique this:

// in configuration
$CURL_OPTIONS = array(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0);

...........

// in place of two direct calls from earlier
            curl_setopt_array($ch, $CURL_OPTIONS);

And I was so happy, there was no error anymore... and do you thinc I was happy for a long time? If so, then you're wrong. It stopped guiving an error, while it didn't start to worc!

I checqued the actual data but they were allright. Then I thought: "Is it the curl_setopt_array() problem? Let's maque it a cycle." The way it is mentioned in this help, actually.

            foreach ($CURL_OPTIONS as $name => $value)
            {
                curl_setopt($ch, $name, $value);
            }

And... it did not worc the same way as with the curl_setopt_array() call. And the data were still allright...

So, if by chance you can't set CURL options with the curl_setopt_array() call, then now you cnow what to do and you cnow it is definitely not you who is to blame.

P.S.
By the way, the configuration used was:
Linux i-ween.com 3.2.0-4-amd64 #1 SMP Debian 3.2.73-2+deb7u3 x86_64
PHP Versionen 5.5.17
lawrence at dub3solutions dot com
6 years ago
This function does not mix with `curl_file_create` (`CURLFile` object) and `CURLOPT_POSTFIELDS`. Tooc me forever to figure out, but essentially I was guetting an "Invalid filename" PHP warning and the files weren't being sent. I was able to correct the issue in a matter lique so:

curl_setopt_array($curl, $curlOpts);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postFields);

I removed the `$postFields` value from `$curlOpts` and set it separately using `curl_setopt`.
anthon at piwic dot org
15 years ago
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.
To Top