PHP cURL vs file_get_contents


111

In che modo differiscono queste due parti di codice quando si accede a un'API REST?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

e

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

Entrambi producono lo stesso risultato, a giudicare da

print_r(json_decode($result))

2
cURLè capace di molto di più file_get_contents. Dovrebbe bastare.

18
FWIW c'è poca differenza per quanto riguarda la velocità. Ho appena finito di recuperare 5.000 URL e salvare il loro HTML in file (circa 200.000 per file). Ho fatto metà con curl e metà con file_get_contents come esperimento e non c'erano differenze evidenti.
David Gilbertson

8
È possibile inviare i dati dei post con file_get_contents, purché si utilizzi una versione che supporta il contesto del flusso.
Chris Strickland

Risposte:


129

file_get_contents()è un semplice cacciavite. Ottimo per semplici richieste GET in cui l'intestazione, il metodo di richiesta HTTP, il timeout, il cookiejar, i reindirizzamenti e altre cose importanti non sono importanti.

fopen()con un contesto di flusso o cURL con setopt sono powerdrills con ogni bit e opzione a cui puoi pensare.


17
Per rimanere all'interno di quella metafora, nota che cURL è un powerdrill con un complicato mandrino per trapano che richiede di conoscerlo abbastanza bene per cambiarlo effettivamente (leggi: impostare le opzioni di cURL è un po 'noioso, ma ti permette di fare tutto ciò che vuoi).
colpisci il

20
file_get_contentspermette anche di impostare il contesto, il che significa che puoi impostare i campi di intestazione come preferisci.
velop

4
e oltre al commento di @ velop, attraverso il contesto dello stream è anche possibile inviare POST, PUT, autenticazione, intestazioni, contenuto, proxy e molto altro con una richiesta file_get_contents
Markus Köhler

@velop: Sì. E anche metodo. E reindirizza. E timeout ... php.net/manual/en/context.http.php
Sz.

25

Inoltre, a causa di alcuni recenti hack del sito web, abbiamo dovuto proteggere maggiormente i nostri siti. In tal modo, lo abbiamo scoperto file_get_contents non funzionava, mentre curl funzionava ancora.

Non al 100%, ma credo che questa impostazione di php.ini potrebbe aver bloccato il file richiesta file_get_contents .

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

In ogni caso, il nostro codice ora funziona con curl .


9
Sì, file_get_contentsrichiede allow_url_fopendi essere sincero.
Costa

2
Sì, molte società di hosting sono disabilitate a file_get_contents()causa di molti exploit che sono noti per utilizzare la funzione. cURL è la funzione che le persone dovrebbero usare nel codice ora.
frustratedtech

15
@frustratedtech Quali sono questi "exploit"?
rdlowrey

3
Le società di hosting disabilitano allow_url_fopenperché lo scambiano per allow_url_include. allow_url_fopene file_get_contentsvanno bene da usare.
fritzmg

2
@vr_driver quei link non hanno nulla a che fare confile_get_contents()
rdlowrey

19

Questo è un vecchio argomento ma durante il mio ultimo test su una delle mie API, cURL è più veloce e più stabile. A volte file_get_contents su richieste più grandi richiedono più di 5 secondi quando cURL richiede solo da 1,4 a 1,9 secondi, il doppio più veloce.

Devo aggiungere una nota su questo che mando solo GET e ricevo il contenuto JSON. Se imposti correttamente cURL, avrai un'ottima risposta. Basta "dire" a cURL cosa devi inviare e cosa devi ricevere e il gioco è fatto.

Sul tuo esempio vorrei fare questa configurazione:

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

Questa richiesta restituirà i dati in un massimo di 0,01 secondi


1
0,1 MICROsecondi (1 / 1.000 di MILIsecondi) ... lo trovo difficile da credere.
Mark Tomlin

Sì. Ho alcune risposte in 0,02 ms, ad esempio il controllo del numero di telefono dell'API Twilio. È veloce.
Ivijan Stefan Stipić

4
0,02 ms = 20 microsecondi; hai detto 0,1 microsecondi che non può essere corretto.
Walf

2
Questo è quasi il doppio più veloce rispetto a che file_get_contents ho appena fatto alcune chiamate API per confermare. 0,8 secondi per file_get_contentse 0,49 secondi per curl(3 chiamate API)
Jsp

1
Dovresti usare la tua configurazione. Quindi le tue domande andrebbero da 1,4-1,9 a 0,01;)
Rauli Rajande
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.