Я строю персональную складскую платформу (не распределенную). Компонент, который я хотел бы иметь, это график EPS на этой странице:
https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes
Как вы можете видеть, на странице есть https
, поэтому после нескольких дней отладки, я включил openssl
и теперь он работает для всех https
страниц, таких как https
страницы facebook и twitter, однако он все еще не работает для меня. необходимость.
file_get_contents('https://facebook.com'); /* works */ file_get_contents('https://twittercom'); /* works */ file_get_contents('https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes');
Я получаю предупреждение:
Warning: file_get_contents(): SSL: crypto enabling timeout in C:\xampp\htdocs\index.php on line 3 Warning: file_get_contents(): Failed to enable crypto in C:\xampp\htdocs\index.php on line 3 Warning: file_get_contents(https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/earnings.jhtml?stockspage=earnings&symbols=AAPL&showPriceLine=yes): failed to open stream: operation failed in C:\xampp\htdocs\index.php on line 3 Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\index.php on line 3
Единственное различие, которое я вижу, это то, что страница верности имеет треугольник около метки https.
Хорошо, я нашел решение. Проблема в том, что сайт использует SSLv3. И я знаю, что есть некоторые проблемы в модуле openssl. Некоторое время назад у меня была такая же проблема с версиями SSL.
<?php function getSSLPage($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSLVERSION,3); $result = curl_exec($ch); curl_close($ch); return $result; } var_dump(getSSLPage("https://eresearch.fidelity.com/eresearch/evaluate/analystsOpinionsReport.jhtml?symbols=api")); ?>
Когда вы устанавливаете версию SSL с curl на v3, тогда она работает.
Редактировать:
Еще одна проблема под Windows заключается в том, что у вас нет доступа к сертификатам. Поэтому ставьте корневые сертификаты прямо на завиток.
http://curl.haxx.se/docs/caextract.html
здесь вы можете загрузить корневые сертификаты.
curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/certs/cacert.pem"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
Затем вы можете использовать параметр CURLOPT_SSL_VERIFYPEER
с true
иначе вы получите сообщение об ошибке.
Имела та же проблема – она была где-то в сертификате ca, поэтому я использовал пакет ca, используемый для завитки, и это сработало. Вы можете скачать комплект curl ca здесь: https://curl.haxx.se/docs/caextract.html
Сведения о шифровании и безопасности см. В этой полезной статье:
https://www.venditan.com/labs/2014/06/26/ssl-and-php-streams-part-1-you-are-doing-it-wrongtm/432
Вот пример:
$url = 'https://www.example.com/api/list'; $cn_match = 'www.example.com'; $data = array ( 'apikey' => '[example api key here]', 'limit' => intval($limit), 'offset' => intval($offset) ); // use key 'http' even if you send the request to https://... $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ) , 'ssl' => array( 'verify_peer' => true, 'cafile' => [path to file] . "cacert.pem", 'ciphers' => 'HIGH:TLSv1.2:TLSv1.1:TLSv1.0:!SSLv3:!SSLv2', 'CN_match' => $cn_match, 'disable_compression' => true, ) ); $context = stream_context_create($options); $response = file_get_contents($url, false, $context);
надеюсь, это поможет
Другим способом, который отлично работает, по крайней мере для отладки, является функция wget и exec (), как показано ниже.
exec ('wget -O /local/destination/folder/filename.tar.gz www.domain.com/files/filename.tar.gz --no-check-certificate');
флаг «-no-check-certificate» заботится о любых проблемах с плохими сертификатами. Будьте осторожны с использованием этого метода в производственной среде.