web-dev-qa-db-fra.com

PHP cURL vs file_get_contents

En quoi ces deux éléments de code diffèrent-ils lorsque vous accédez à une API REST?

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

et

$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);

Ils produisent tous les deux le même résultat, à en juger par

print_r(json_decode($result))
98
Salvador Dali

file_get_contents() est un simple tournevis. Idéal pour les requêtes GET simples où l’en-tête, la méthode de requête HTTP, le délai d’attente, le cookiejar, les redirections et d’autres éléments importants n’ont aucune importance.

fopen() avec un contexte de flux ou cURL avec setopt sont des perceuses puissantes avec tous les bits et toutes les options auxquels vous pouvez penser.

113
Xeoncross

De plus, en raison de piratages récents de sites Web, nous avons dû sécuriser davantage nos sites. Ce faisant, nous avons découvert que fichier_contenu échoué à travailler, où curl fonctionnerait toujours.

Pas à 100%, mais je crois que ce paramètre php.ini a peut-être bloqué le fichier_contenu demande.

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

De toute façon, notre code fonctionne maintenant avec curl.

22
vr_driver

C’est un sujet ancien, mais lors de mon dernier test sur une API, cURL est plus rapide et plus stable. Parfois, file_get_contents sur une requête plus importante a besoin de plus de 5 secondes lorsque cURL n'a besoin que de 1,4 à 1,9 secondes, soit deux fois plus vite.

Je dois ajouter une note à ce sujet, à savoir que je viens d'envoyer les contenus JET GET et recive. Si vous configurez correctement cURL, vous obtiendrez une excellente réponse. Il suffit de "dire" à CURL ce que vous devez envoyer et ce dont vous avez besoin pour recevoir, et c'est tout.

Sur votre exampe je voudrais faire cette configuration:

$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);

Cette demande renverra des données en 0.01 seconde maximum

16