PHP Australia Conference 2015

curl_setopt_array

(PHP 5 >= 5.1.3)

curl_setopt_arrayConfigura múltiples opciones para una transferencia cURL

Descripción

bool curl_setopt_array ( resource $ch , array $options )

Configura multiples opciones para una sesión cURL. Esta función es muy útil para configurar gran cantidad de opciones cURL sin tener que llamar cada vez curl_setopt().

Parámetros

ch

El recurso cURL devuelto por curl_init().

opciones

Un array especificando que opciones a configurar y con que valores. Las keys deben contener constantes curl_setopt() válidas o sus integer equivalentes.

Valores devueltos

Devuelve TRUE si todas las opciones se configuraron satisfactoriamente. Si una opción no se pudo configurar devolverá FALSE inmediatamente. Ignorando cualquier otra opción en el array de opciones.

Ejemplos

Ejemplo #1 Iniciando una nueva sesión cURL y capturando una página web

<?php
// Crea un nuevo recurso cURL
$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);

// close cURL resource, and free up system resources
curl_close($ch);
?>

Anterior a PHP 5.1.3 esta función puede ser simulada con:

Ejemplo #2 O nuestra implementación de 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;
   }
}
?>

Notas

Nota:

Igual que curl_setopt(), si se pasa un array a CURLOPT_POST codificará los datos como multipart/form-data, mientras que si pasa una cadena URL-encoded codificará los datos como application/x-www-form-urlencoded.

Ver también

  • curl_setopt() - Configura una opción para una transferencia cURL

add a note add a note

User Contributed Notes 5 notes

up
3
maran dot emil at gmail dot com
5 years ago
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);

?>
up
1
anthon at piwik dot org
4 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.
up
1
bendavis78 at gmail dot com
8 years ago
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)
up
0
loop4u at gmail dot com
3 years ago
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]);
}
?>
up
-3
fnjordy at gmail dot com
5 years ago
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);
// ...
?>
To Top