Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Curl+https: не работает с некоторыми ресурсами
Форумы портала PHP.SU » » Работа с сетью » Curl+https: не работает с некоторыми ресурсами

Страниц (1): [1]
 

1. Dein - 09 Июня, 2014 - 10:10:45 - перейти к сообщению
Привет, народ!

В общем, ситуация такая: понадобилось мне написать скрипт, который отображает на сайте список твитов. Как известно, у Twitter доступ только по OAuth, так что нужно на PHP писать такой себе "шлюз", который авторизуется у Twitter по HTTPS, забирает список твитов и отдаёт их в ajax-запросе, собственно, самой странице, на которой этот список нужно разместить.

Для всего этого используется PHP-библиотека twitteroath:
https://github[dot]com/abraham/twitteroauth

Проблема заключается в том, что после выполнения curl_exec в скрипте twitteroauth сервер на моём хостинге сбрасывает соединение, и всё... тишина, никакого тебе перехвата ошибок curl, ничего.

Залил я эти скрипты на другой свой сайт (размещён в другом аккаунте у того же провайдера), и - о чудо! - всё заработало!

Нашёл я два простеньких скрипта для тестирования работы Curl с HTTPS:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //Filename: curl_test.php
  3. $ch = curl_init();
  4. curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  5. curl_setopt($ch, CURLOPT_HEADER, 1);
  6. curl_setopt($ch, CURLOPT_VERBOSE, 1);
  7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  8.  
  9. //Uncomment this for Windows.
  10. //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  11.  
  12. curl_setopt($ch, CURLOPT_URL, "https://www.stanford.edu/group/idg/leland/samples/secure/test.html");
  13. $result = curl_exec($ch);
  14. echo '<pre>';
  15. echo '</pre>';
  16. echo 'Errors: ' . curl_errno($ch) . ' ' . curl_error($ch) . '<br><br>';
  17. curl_close ($ch);
  18. echo $result . 'EOF';
  19. ?>


и

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function curl_get_file_contents($URL) {
  3.        $c = curl_init();      
  4.        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  5.        curl_setopt($c, CURLOPT_URL, $URL);
  6.        $contents = curl_exec($c);
  7.        curl_close($c);
  8.        if ($contents) return $contents;
  9.            else return FALSE;
  10.    }
  11. echo curl_get_file_contents("http://yandex.ru");
  12.  
  13. ?>


Так вот, оказалось, что второй скрипт (который обращается к Яндексу) стабильно работает на обоих сайтах, а вот первый скрипт работает только на втором (как, собственно и twitteroath).
Т.е. совершенно очевидно, что проблема с работой Curl и HTTPS.

Пожалуйста, подскажите, что может быть не то с первым хостингом? Или что я неправильно делаю?

Заранее, ОГРОМНЕЙШЕЕ СПАСИБО за помощь!

P.S.: Сранивал php_info() - версия PHP одна и та же, версия OpenSSL тоже. А вот версии Curl отличаются.
На первом хостинге:
CODE (htmlphp):
скопировать код в буфер обмена
  1. libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2


На втором:
CODE (htmlphp):
скопировать код в буфер обмена
  1. libcurl/7.24.0 OpenSSL/1.0.0 zlib/1.2.3 libidn/1.18
2. OrmaJever - 09 Июня, 2014 - 11:29:28 - перейти к сообщению
добавьте 2 строки
PHP:
скопировать код в буфер обмена
  1. curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, 0);
  2. curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, 0);
3. Dein - 09 Июня, 2014 - 11:58:48 - перейти к сообщению
OrmaJever пишет:
добавьте 2 строки
PHP:
скопировать код в буфер обмена
  1. curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, 0);
  2. curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, 0);

Добавил, но, к сожалению, всё то же самое - сервер на первом хостинге сбрасывает соединение, а на втором всё замечательно.

Вообще, по идее, если у Curl проблемы с сертификатом, он просто должен возвратить ошибку и продолжить выполнения PHP-скрипта.

Самое интересное, что данные о запросе клиентом данного php-скрипта вообще не заносятся в логи Апача, как будто и не было никаких запросов к нему. Ведь если случается какая-то фигня на стороне сервера при выполнении curl_exec, Апач должен добавить в логи хотя бы строчку о попытке доступа к странице и результате с каким-нибудь кодом из серии 5xx.

 

Powered by ExBB FM 1.0 RC1