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 секунды