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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Curl+https: не работает с некоторыми ресурсами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: curl местами работает, а местами - нет...
Dein
Отправлено: 09 Июня, 2014 - 10:10:45
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




Привет, народ!

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

(Отредактировано автором: 09 Июня, 2014 - 10:54:53)

 
 Top
OrmaJever Модератор
Отправлено: 09 Июня, 2014 - 11:29:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




добавьте 2 строки
PHP:
скопировать код в буфер обмена
  1. curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, 0);
  2. curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, 0);


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Dein
Отправлено: 09 Июня, 2014 - 11:58:48
Post Id



Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Июнь 2014  


Помог: 0 раз(а)




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.

(Отредактировано автором: 09 Июня, 2014 - 12:00:40)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с сетью »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB