PHP cURL vs file_get_contents

Как эти два фрагмента кода отличаются при доступе к API REST?

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

и

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

Оба они дают одинаковый результат, судя по

print_r(json_decode($result))

Ответ 1

file_get_contents() - простая отвертка. Отлично подходит для простых запросов GET, где заголовок, метод HTTP-запроса, тайм-аут, cookiejar, перенаправления и другие важные вещи не имеют значения.

fopen() с контекстом потока или cURL с setopt являются powerdrills с каждым битом и вариант, о котором вы можете подумать.

Ответ 2

В дополнение к этому, из-за недавних хакеров сайта нам пришлось больше защищать наши сайты. При этом мы обнаружили, что file_get_contents не удалось работать, где curl все равно будет работать.

Не 100%, но я считаю, что этот параметр php.ini, возможно, блокировал запрос file_get_contents.

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

В любом случае наш код теперь работает с curl.

Ответ 3

Это старая тема, но в моем последнем тесте на одном моем API cURL быстрее и стабильнее. Иногда file_get_contents по большему запросу требуется более 5 секунд, когда cURL нужно только от 1,4 до 1,9 секунд, что вдвое быстрее.

Мне нужно добавить одну заметку, чтобы просто отправить GET и получить JSON-контент. Если вы правильно настроили cURL, у вас будет отличный ответ. Просто "скажите" cURL, что вам нужно отправить, и что вам нужно, чтобы получить и что это.

На вашем примере я бы хотел сделать эту настройку:

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

Этот запрос будет возвращать данные с максимальным значением 0.01 секунды