back to top

PHP cURL: interagire con pagine web e risorse remote

A partire dalla versione 4.0.2, PHP supporta libcurl (o più comunemente cURL), una potente libreria grazie alla quale i nostri script PHP potranno comunicare con server remoti per svolgere determinate operazioni di invio e/o ricezione dati.

Premessa

cURL è alquanto flessibile e consente di instaurare comunicazioni con server remoti sfruttando diversi protocolli:

  • http
  • https
  • ftp
  • gopher
  • telnet
  • dict
  • file
  • ldap

Attraverso cURL potremo effettuare svariate operazioni su server remoti, ad esempio potremo:

  • recuperare il contenuto di una pagina web (scraping);
  • effettuare il submit di un form;
  • effettuare autenticazioni ad aree protette;
  • connetterci ad un web service;
  • e molto altro ancora.

In questo articolo vi mostrerò il funzionamento di cURL partendo, come di consueto, da un esempio di base.

Prima di passare al codice, tuttavia, è importante sottolineare che per sfruttare la potenza della libreria libcurl, è necessario che PHP sia stato compilato con il supporto a cURL: le funzioni che andremo a presentare, infatti, non rientrano tra le funzioni native del linguaggio ma sono parte di una libreria esterna che, come tale, deve essere presente sul sistema e correttamente attivata.

La prima cosa da fare, quindi, è verificare che il nostro sistema supporti cURL.

Esempio base di utilizzo di cURL

Nel nostro primo esempio vedremo come utilizzare cURL per stampare a video il contenuto di una risorsa remota:

// inizializzo cURL
$ch = curl_init();

// imposto la URL della risorsa remota da scaricare
curl_setopt($ch, CURLOPT_URL, 'http://www.sito.com/pagina.html');

// imposto che non vengano scaricati gli header
curl_setopt($ch, CURLOPT_HEADER, 0);

// eseguo la chiamata
curl_exec($ch);

// chiudo cURL
curl_close($ch);

Come è possibile notare da questo primo (e rudimentale) esempio, le funzioni fonfamentali della libreria cURL sono quattro:

  • curl_init() – E’ utilizzata per inizializzare la sessione di cURL ed è, necessariamente, la prima funzione a dover essere chiamata.
  • curl_setopt() – E’ utilizzata per settare le varie opzioni previste da libcurl; questa funzione può essere utilizzata più volte nello stesso script; ovviamente le opzioni devono essere settate prima della chiamata vera e propria che avviene con la funzione curl_exec().
  • curl_exec() – Esegue la chiamata remota secondo le specifiche definite mediante le varie chiamate di curl_setopt().
  • curl_close() – E’ la funzione che chiude la sessione di cURL e libera le risorse che erano state allocate per la sua esecuzione.

Come credo sia facile intuire, la funzione curl_setopt() assume un ruolo fondamentale in quanto è grazie ad essa che possiamo personalizzare in modo estremamente minuzioso l’utilizzo della libreria. Vediamo quindi, di seguito, le opzioni principali e più frequentemente utilizzate.

Le opzioni principali di cURL

Impostare la URL della risorsa remota

Abbiamo già visto come impostare la URl della risorsa remota utilizzando curl_setopt(), tuttavia cURl ci permtte una scorciatoia. La URL, infatti, può essere definita anche passandola come parametro alla funzione curl_init() in questo modo:

$ch = curl_init('http://www.sito.com/pagina.html');

Stampare a video gli header

Possiamo decidere se passare gli header allo strem della chiamata oppure no. Per farlo si utilizza l’opzione CURLOPT_HEADER come abbiamo già visto nel primo esempio di questa guida.

Impostare un referrer ed uno User-Agent

Tra le tantissime opzioni di cURL che è possibile settare mediante curl_setopt(), possiamo specificare un referrer ed uno user-agent che verranno trasmessi nell’intestazione delle nostre chiamate al server remoto:

// imposto un fake referrer
curl_setopt($ch, CURLOPT_REFERER, 'http://www.esempio.com/finto-referer.html');
 
// Imposto uno user-agent in modo arbitrario
curl_setopt($ch, CURLOPT_USERAGENT, 'MozillaXYZ/1.0 Finto User-Agent');

La previsione di questi elementi, talvolta, è indispensabile per il buon esito della chiamata in quanto non è infrequente che il server remoto rifiuti la connessione se priva di talune informazioni (come, soprattutto, l’User Agent).

Impostare un timeout

Altra opzione molto utilizzata è, appunto, il timeout cioè un lasso di tempo oltre il quale PHP dovrà chiudere la connessione in assenza di risposta. L’importanza di questa opzione è evidente in quanto grazie ad essa è possibile evitare blocchi nell’esecuzione degli script che potrebbero creare non pochi problemi.

// imposto il timeout a 10 secondi
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

Restituire l’output sotto forma di stringa

Altra opzione molto importante è CURLOPT_RETURNTRANSFER: grazie ad essa, in pratica, si stabilisce se cURL debba stampare a video il contenuto recuperato dalla risorsa remota oppure no. Se il valore è settato su "true" il contenuto remoto non viene stampato ma "restituito" (e, quindi, può essere – ad esempio – salvato all’interno di una variabile):

// evito che il contenuto remoto venga passato a print
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// ...

// salvo il risultato in una variabile
$output = curl_exec($ch);

Se questa opzione non viene utilizzata e settata su true, cURL passerà di default l’output recuperato dalla risorsa remota alla funzione print.

Risolvere eventuali redirect

Attraverso cURL è anche possibile risolvere eventuali redirect della risorsa remota, in altre parole è possibile seguire i redirect HTTP 3xx. Per attivare questa possibilità si utilizza:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Attenzione: quando safe_mode è attivato oppure open_basedir è settato, l’utilizzo di questa opzione potrebbe generare un warning di questo tipo:

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION 
cannot be activated when in safe_mode or an open_basedir is set in ...

Esempi avanzati di utilizzo di cURL

Vediamo di seguito alcuni esempi di utilizzo della libreria libcurl.

Utilizzare cURL per copiare in locale un file remoto

Possiamo utilizzare cURL per creare una copia locale di un file remoto. Vediamo, ad esempio, come salvare in locale un’immagine presente all’interno di un sito web:

// creo un file JPG in locale sul quale salverò l'immagine remota
$fp = fopen('fotografia.jpg', '');

// inizializzo cURL
$ch = curl_init();

// imposto la URL della risorsa remota da scaricare
curl_setopt($ch, CURLOPT_URL, 'http://www.sito.com/immagine.jpg');

// imposto che non vengano scaricati gli header
curl_setopt($ch, CURLOPT_HEADER, 0);

// imposto che il contenuto del file remoto venga scritto nel file locale (di cui specifico il puntatore)
curl_setopt($ch, CURLOPT_FILE, $fp);

// eseguo la chiamata
curl_exec($ch);

// chiudo cURL
curl_close($ch);

// chiudo il puntatore al file locale
fclose($fp);

Inviare dei dati col metodo POST

Mediante cURL possiamo effettuare il submitting di un form remoto, possiamo cioè inviare dati col metodo POST esattamente come se stessimo compilando a mano un modulo:

// definisco in un array i campi del form remoto
// ed i rispettivi valori che desidero inserirvi
$campi = array(
  'nome' => 'Mario',
  'cognome' => 'Rossi',
  'email' => '[email protected]'
);

// trasformo la mia array in una stringa
$dati = '';
foreach ($campi as $k => $v) {
  $dati .= $k . '=' . urlencode($v) . '&';
}
rtrim($dati, '&');

// inizializzo curl
$ch = curl_init();

// imposto la URl del form remoto
curl_setopt($ch, CURLOPT_URL, 'http://www.sito.com/modulo.php');

// preparo l'invio dei dati tramite il metodo POST
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dati);

// eseguo la chiamata
curl_exec($ch);

// chiudo
curl_close($ch);

Inviare dei dati nel formato JSON ad un web-service remoto

Mediante cURL possiamo connetterci ad un web-service remoto ed inviare dei dati nel formato JSON. Vediamo un esempio:

// definisco in un array di valori da trasmettere ad un web service remoto
// che restituisce un ipotetico servizio di previsioni meteo
$campi = array(
  'user' => 'miouser',
  'apikey' => '123456789abcdefg',
  'giorno' => '15/07/2015',
  'citta' => 'Alassio'
);

// trasformo la mia array in JSON
$dati = json_encode($campi);

// inizializzo curl
$ch = curl_init();

// imposto la URl del web-service remoto
curl_setopt($ch, CURLOPT_URL, 'http://www.sito.com/meteo.php');

// preparo l'invio dei dati col metodo POST
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dati);

// imposto gli header correttamente
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/json',
  'Content-Length: ' . strlen($dati))
);

// eseguo la chiamata
curl_exec($ch);

// chiudo
curl_close($ch);

Conclusioni

Grazie alla libreria libcurl possiamo creare script davvero molto potenti per consentire al nostro sito web di interagire con sistemi remoti di vario tipo ed in vario modo. La sua potenza e versatilità possono rivelarsi alleati indispensabili in molti scenari del web-developing moderno: oggi, infatti, un sito web non è più considerato come una realtà a se stante, ma come parte di un sistema più vasto fatto di interazioni remote costanti col altri siti e servizi.

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Correggere l’errore the uploaded file exceeds the upload_max_filesize directive in php.ini

L'errore the uploaded file exceeds the upload_max_filesize directive in...

Cannot modify header information – headers already sent: come risolvere l’errore PHP

L'errore di PHP cannot modify header information - headers...

Ricavare l’estensione di un file con PHP

Quando si lavora con i file in un'applicazione web,...

GD Library: creazione, manipolazione e ridimensionamento immagini con PHP

Le librerie GD (o GD Library), sono componenti fondamentali...

PHP: impostare il fuso orario italiano

Le tue pagine PHP non mostrano l’orario corretto? Probabilmente...
Pubblicitร