file_get_contents () против curl для вызова API с PHP - PullRequest
9 голосов
/ 12 марта 2012

В соответствии с описанием 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-код умирал при попытке открыть его.

После этого я попробовал с curl, и это сработало. Код был такой:

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

Вопросы

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

Ответы [ 3 ]

12 голосов
/ 12 марта 2012

Вопрос 1:

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

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

Вопрос 2:

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

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

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

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

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

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

4 голосов
/ 12 марта 2012

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 еще более полон, поскольку он дает, например, возможность работать с несколькими параллельными обработчиками .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...