file_get_contents () против curl для вызова API с PHP

В соответствии с описанием API пользовательского поиска Google вы можете вызвать его с помощью GET-глагола интерфейса REST, например, с помощью примера:

GET https://www.googleapis.com/customsearch/v1?key=INSERT-YOUR-KEY&cx=017576662512468239146:omuauf_lfve&q=lectures 

Я настраиваю свой ключ API и систему пользовательского поиска, а при вставке моего тестового запроса непосредственно в мой браузер он работал нормально, и я получил файл JSON для меня.

Затем я попытался вызвать API из своего PHP-кода, используя:

 $json = file_get_contents("$url") or die("failed"); 

Где $ url был тем же, который работал в браузере, но мой PHP-код умирал при попытке его открыть.

После этого я попытался с завитом, и это сработало. Код был следующий:

 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $body = curl_exec($ch); 

Вопросы :

  1. Как получилось, что file_get_contents () не работает и завиток?
  2. Могу ли я использовать fsocket для этого?

Вопрос 1:

Сначала вы должны проверить установку ini allow_url_fopen , allow_url_fopen , это единственная причина, почему file_get_contents() не должен работать. Также может быть safe_mode недопустимый safe_mode .

О, исходя из вашего комментария, вы должны добавить http:// в URL-адрес при использовании с функциями файловой системы , это оболочка, которая сообщает php, что вам нужно использовать HTTP-запрос, без функции, которую, как вам кажется, требуется открыть ./google.com (то же, что и google.txt ).

Вопрос 2:

Да, вы можете построить почти любой запрос cURL с сокетами.

Мое личное мнение заключается в том, что вы должны придерживаться cURL, потому что:

  • настройки тайм-аута
  • обрабатывает все возможные HTTP-состояния
  • простая и подробная конфигурация (нет необходимости в подробном знании заголовков HTTP)

file_get_contents вероятно, перепишет ваш запрос после получения IP-адреса, получив то же самое, что и:

 file_get_contents("xxx.yyy.www.zzz/app1",...) 

Многие серверы откажут вам в доступе, если вы пройдете через IP-адресацию в запросе.
С cURL эта проблема не существует. Он разрешает имя хоста, оставляя запрос по мере его установки, поэтому сервер не является грубым в ответ.
Это может быть и «причина».

1) Почему вы используете кавычки при вызове file_get_contents ?

2) Как уже упоминалось в комментарии, file_get_contents требует allow_url_fopen на вашем php.ini .

3) Вы можете использовать fsockopen , но вам придется обрабатывать HTTP-запросы / ответы вручную, что было бы заново изобрести колесо, когда у вас есть cURL. То же самое касается socket_create .

4) Что касается названия этого вопроса: cURL может быть более настраиваемым и полезным для работы со сложными HTTP-транзакциями, чем с file_get_contents . Хотя следует отметить, что работа с потоковыми контекстами позволяет вам сделать много настроек для ваших вызовов file_get_contents . Однако я думаю, что cURL еще более совершенен, поскольку он дает вам, например, возможность работы с несколькими параллельными обработчиками .