PHP curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false) слишком медленно

#php #facebook #curl

#php #Facebook #curl

Вопрос:

Я использую этот метод для получения данных facebook api. просто поисковый запрос. но я считаю, что использование curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); требует больше времени в течение curl времени (более 10 секунд).

Есть ли другой curl метод, который может работать быстрее?

Примечание: Сейчас я тестирую на localhost

 $url = "https://graph.facebook.com/search?access_token=".$token."amp;q=dallasamp;type=postamp;scope=publish_stream,offline_access,user_status,read_stream";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 2);
//curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__). '/file.crt'); the way as Lumbendil recommend, download a crt file via firefox. still slowly.
$body= curl_exec($ch);
curl_close ($ch);
  

PS: Я не хочу использовать SDK , потому что я не смог установить SDK в тестировании localhost. Хотя я прочитал много статей о том, как установить в localhost. Я установил http://127.0.0.1/facebook в качестве URL обратного вызова. Но просто сбой. Поэтому я все еще хочу получить простой способ curl.

Спасибо.

Ответ №1:

Вы могли бы использовать файл .crt и сверяться с ним вместо игнорирования проверки SSL, как описано здесь .

Чтобы сохранить всю информацию в одном месте: В вашем коде вы должны написать следующее:

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/crt/file.crt');
  

Чтобы получить сертификат, вы должны перейти с помощью браузера на страницу, а затем с помощью «просмотреть сертификат» вы должны экспортировать его. Помните, что вы должны экспортировать его как сертификат X.509 (PEM), чтобы это сработало. Для получения более подробного руководства по экспорту сертификата перейдите по предоставленной ссылке.

Комментарии:

1. Не вызовет ли это проблем при изменении сертификата?

2. На самом деле это должно вызвать проблемы, если знак сертификата изменится, в этом весь смысл SSL-соединения, чтобы избежать возможности того, что кто-то заменит URL.

3. Я имею в виду, когда Facebook заменяет его, потому что срок его действия истек. Например, текущий сертификат будет заменен к декабрю 2013 года.

4. В ссылке объясняется, как получить сертификат верхнего объекта. Когда срок действия этого параметра истечет, да, его нужно будет обновить. Для этого вы могли бы настроить cron, который выполняется еженедельно или ежемесячно.

5. @Lumbendil, не сработало, я следил за статьей и скачал файл из https://graph.facebook.com/... , затем сохранил в той же папке, что и мой php-файл. curl_setopt($ch, CURLOPT_CAINFO, 'file.crt'); или curl_setopt($ch, CURLOPT_CAINFO, '/file.crt'); или возврат Warning: Invalid argument supplied for foreach()

Ответ №2:

Если игнорирование проверки сертификата занимает 10 секунд, проблема не в сертификате или с проверкой и, откровенно говоря, это, вероятно, вообще не связано с SSL.

Игнорирование проверки сертификата должно быть очень быстрым и не поддаваться измерению по сравнению с тем, сколько времени занимает остальная процедура подтверждения SSL.

Чтобы правильно отследить проблему, я бы рекомендовал вам использовать инструмент командной строки curl и его опции —trace-ascii и —trace-time, чтобы увидеть, что, по-видимому, требует времени. Возможно, вам потребуется просмотреть сеть с помощью wireshark или аналогичного, чтобы получить еще лучшую картину происходящего.

Я не вижу, как другие предложения по добавлению проверки сертификата в микс сделают что-либо быстрее.

Комментарии:

1. вы пробовали поиск по графику самостоятельно? Я медленно ломаю голову. Я не знаю, медленно ли это вызвано localhost или если переход на реальный сервер будет выполняться быстрее.

2. Я сопровождающий libcurl и ведущий разработчик, я сделал свою долю использования curl во многих ситуациях (хотя и не с PHP), но я никогда не сталкивался с такой странной ситуацией.

Ответ №3:

Просто примечание, но если вы хотите использовать SDK, вы можете обойти локальную проблему, отредактировав файл hosts и добавив localhost.local для 127.0.0.1. /etc/hosts на компьютере с Linux и C:WINDOWSsystem32driversetchosts на компьютере с Windows.

Затем в настройках приложения Facebook просто установите localhost.local в качестве своего домена и соответствующим образом задайте URL своего сайта.

Тогда вы должны быть готовы к работе.